我想要的是第一个变成第二个..
/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 +”
行为,在这种情况下,“列表”,可以有很多值,更多将被添加。
任何额外的查询参数将只传递$ args,我猜。
基本上URL没有指定版本将去index.php,然后可以决定什么特定的版本文件包括。 我害怕发生的是循环 – 这应该坐下来
location /widget {
对?。
(至于将API的版本放在URL中,我并不想成为RESTful,而且目标受众很less)
关于如何完全在index.php中使用“路由器”完成这些资源也欢迎: – /
有了三条规则,你就可以匹配示例和下面的小部件:
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;
我已经使用在线正则expression式testing程序编写了这些testing程序,但没有使用Nginx设置testing环境。
第一条规则将所有的情况与一个版本号进行匹配,包括有无斜线,有无动作参数。
第二个规则将覆盖没有任何参数的基本的窗口小部件调用,再次使用和不使用斜线。
最后一条规则将覆盖所有非版本化的窗口部件调用,包括有无斜线以及是否带有?act参数。
最后两条规则的顺序很重要。
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 { ... } }
为了匹配您需要捕获组()的数字,这是一个正则expression式概念。
捕获组在重写中被引用为$1 ,这意味着“反向引用1”
虽然我不知道这是否会成为你的可持续发展名单。
例如,为什么不捕获所有内容,而是将其添加到重写规则中,而不是捕获?act=list :
rewrite ^/widget(.*) /widget/index.php?$1 last;
我不能100%确定你的URL在重写之前的样子,所以我不能给出一个全面的规则。