在我的服务器的 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/?$ {}
尽管它不像我所希望的那样只有一行,但它还是完成了工作。