nginx重写正则expression式的API版本

我想要的是第一个变成第二个..

/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在重写之前的样子,所以我不能给出一个全面的规则。