由于旧版项目, 依旧使用php-fpm模式提供api服务, 采用 类似 /api.php?m=account&act=login类似这种方式进行控制器分类.

目前的话 打算更换为其他框架, 使用路由来分配控制器.

由于前端及软件迁移成本较高, 就想着是否可以通过Nginx的伪静态来重写.

于是一开始尝试使用

1
2
3
4
location / {
proxy_pass https://127.0.0.1:8787;
rewrite ^api.php\?m=(.*)&act=(.*) /$1/$2 break;
}

直接对其进行重写, 但测试后发现并为达到预期的效果, 服务端接收到的 依旧只有/api.php

貌似并未被nginx匹配到, 查询过后发现 这样貌似是匹配不到路径的?

最终在查询过后, 发现可以通过 query_string 来对其进行匹配

1
2
3
4
5
6
7
8
9
10
11
12
location /api.php {
proxy_pass http://127.0.0.1:8787;
if ( $query_string ~ ^m=(.*)&act=(.*)) {
set $a $1;
set $b $2;
rewrite ^/(.*)$ /$a/$b break;
}
}

location / {
proxy_pass http://127.0.0.1:8787;
}

修改配置文件后, 再次对其进行测试, 成功将/api.php?m=account&act=login重写为/account/login