在 Nginx 配置中,如何限制正则表达式匹配?

在 Nginx 配置中,如何限制正则表达式匹配?

在我的服务器的 nginx 配置文件中,我编写了以下位置块:

location ~ /page/(?!(3/?|5/?|6/?|8/?)) {
    return 301 https://anothersite.com/page$is_args$args;
}

为此,我尝试重定向所有 /page/,但以下内容除外:

/page/3
/page/3/
/page/5
/page/5/
/page/6
/page/6/
/page/8
/page/8/

这对那些页面来说很有效。但是,这也会排除以该模式开头的任何页面。因此,像以下页面

/page/33
/page/814
/page/577

不会被重定向,但应该被重定向。我应该如何更改该正则表达式,以便将匹配限制为 /page/ 之后的第一个字符(带或不带尾部斜杠)?

我也尝试过这个:

location ~ "/page/(?!([3]{1}/?|[5]{1}/?|[6]{1}/?|[8]{1}/?))" {
    return 301 https://anothersite.com/page$is_args$args;
}

然而,这似乎与第一个模式完全一样。

任何帮助都非常感谢!提前致谢!

答案1

您需要用 匹配字符串的结尾$。这意味着超出该点的字符串将与正则表达式不匹配。

例如:

location ~ /page/(?!(3/?|5/?|6/?|8/?))$ {

答案2

不幸的是,我没能解决这个问题。我最终这样做了:

location /page/ { return 301 https://anothersite.com/page$is_args$args; } location ~ ^/page/3/?$ {} location ~ ^/page/5/?$ {} location ~ ^/page/6/?$ {} location ~ ^/page/8/?$ {}

尽管它不像我所希望的那样只有一行,但它还是完成了工作。

相关内容