nginx 重写正则表达式以进行 API 版本控制

nginx 重写正则表达式以进行 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+”
行为,在本例中是“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 在重写之前会是什么样子,所以我无法为此提供全面的规则。

相关内容