【发布时间】:2021-03-19 01:56:00
【问题描述】:
这是我的两条 nginx 规则:
rewrite ^(/v1/foobar)(.*)$ /final$2 permanent;
rewrite ^(/v1/foobar-tow)(.*)$ /final$2 permanent;
我希望/v1/foobar-two/foo 将使用第二条规则,然后重定向到/final/foo,但我没有:因为 URL 以 foobar 开头,所以将使用第一条规则,最后将重定向到 @987654325 @ : 第一个目标的拼接和第一条规则和第二条规则的区别!
为了解决这个问题,我只是颠倒了规则,但我想知道是否有更好的解决方案!
总之,这就是我要找的:
- /v1/foobar -> /final
- /v1/foobar/hello -> /final/hello
- /v1/foobar-tow -> /final
- /v1/foobar-tow/hola -> /final/hola
【问题讨论】:
-
rewrite规则正在由 nginx 从头到尾处理,只需交换它们就可以了。 -
第一次重写足够松以捕获第二次,因此它可能永远不会评估第二个条件。
-
您可能需要
^(/v1/foobar)(/.*)?$作为第一条规则。斜线将要求整个子部分与foobar部分匹配。 -
您可以使用
^(/v1/foobar(?:-tow)?)(.*)$将其合并为一条规则 -
@MonkeyZeus 确实是最好的答案!但是,这可以简化为
rewrite ^/v1/foobar(?:-tow)?(.*) /final$1 permanent;(不需要两个捕获组)。