我想要的是将第一个变成第二个。
/widget => /widget/index.php
/widget/ => /widget/index.php
/widget?act=list => /widget/index.php?act=list
/widget/?act=list => /widget/index.php?act=list
/widget/list => /widget/index.php?act=list
/widget/v2?act=list => /widget/v2.php?act=list
/widget/v2/?act=list => /widget/v2.php?act=list
/widget/v2/list => /widget/v2.php?act=list
v2 也可以是 v45,基本上是“v\d+”
行为,在本例中是“list”,可以有许多值,并且会添加更多值。
我猜任何其他查询参数都会通过 $args 传递。
基本上,未指定版本的 URL 将转到 index.php,然后它可以决定要包含哪个特定版本的文件。我担心的是发生循环 - 这应该放在
location /widget {
正确的?。
(至于将 API 的版本放在 URL 中,我并不是想采用 RESTful 风格,而且目标受众也很少)
也欢迎提供有关如何使用“路由器”在 index.php 中完全执行此操作的资源 :-/
答案1
通过三条规则,您可以匹配示例案例和以下版本的小部件:
rewrite ^\/widget\/(v\d+)\/?(\?act=)?(.*)$ /widget/$1.php?act=$2 last;
rewrite ^\/widget\/?$ /widget/index.php last;
rewrite ^\/widget\/?(\?act=)?(.*) /widget/index.php?act=$2 last;
我使用在线正则表达式测试器编写了这些内容,但没有使用 Nginx 设置测试环境。
第一条规则将匹配所有带有版本号的情况,包括带或不带斜线、带或不带 ?act 参数。
第二条规则将涵盖不带任何参数的基本小部件调用,同样带有和不带有尾部斜杠。
最后一条规则将涵盖所有非版本化的小部件调用,无论是否带有斜线,无论是否带有参数?act
。
最后两条规则的顺序很重要。
答案2
server {
...
rewrite ^/widget$ /widget/index.php last;
rewrite ^/widget/$ /widget/index.php last;
rewrite ^/widget\?act=list$ /widget/index.php?act=list last;
rewrite ^/widget/\?act=list$ /widget/index.php?act=list last;
rewrite ^/widget/list$ /widget/index.php?act=list last;
rewrite ^/widget/v(\d+)\?act=list$ /widget/v$1.php?act=list last;
rewrite ^/widget/v(\d+)/\?act=list$ /widget/v$1.php?act=list last;
rewrite ^/widget/v(\d+)/list$ /widget/v$1.php?act=list last;
...
location /widget {
...
}
}
要匹配数字,您需要一个捕获组()
,这是一个正则表达式概念。
捕获组在重写中引用为,$1
这意味着“反向引用 1”
虽然我不知道这对你来说是否是一个可持续的列表。
例如,除了捕获之外?act=list
,为什么不捕获所有内容,然后将其重新添加到重写规则中,如下所示:
rewrite ^/widget(.*) /widget/index.php?$1 last;
我不能 100% 确定您的 URL 在重写之前会是什么样子,所以我无法为此提供全面的规则。