我正在清理我们的配置,所以我想到使用正则表达式,因为我可以删除大量的行。我想知道为什么新规则无法正常工作或工作方式不同。
下面的规则目前在我们的开发、阶段和生产中。它运行良好。我们有许多看起来像这样的规则,但第二条路径有所不同。
location /app/sss/cifs/ {
proxy_pass http://int-svr/sss/s3/dev/app/sss/cifs/;
}
我添加了一条新规则(如下所示),并注释掉了上面的内容
location ~ ^/app/(...)/cifs(.*) {
proxy_pass http://int-svr/$1/s3/dev/app/$1/cifs$2;
}
当使用原始规则时,我的 http 调用是http://localhost/app/sss/cifs
,我可以看到该页面。但是,如果我使用使用正则表达式的新规则,我在浏览器上输入的 url 在访问该页面后会发生变化,并且我会得到 404。url 将变为http://localhost/sss/s3/dev/app/sss/cifs
。奇怪的是,proxy_pass 上的值被泄露了。
顺便说一句,如果我使用正则表达式规则并且我的调用是http://localhost/app/sss/cifs/
,它将起作用。不同之处在于此链接末尾有一个斜杠。在旧规则中,无论是否带有尾部斜杠,http 请求都可以正常工作。
有任何想法吗?
基本上,我想要原始规则的行为,但使用正则表达式。
答案1
您的问题中有两个潜在问题。
前缀位置(您的第一条规则)和正则表达式位置(您的第二条规则)具有不同的评估顺序。因此,很容易将前缀位置替换为正则表达式位置,并发现其在配置文件中的优先顺序已更改。请参阅这个文件了解详情。
第二个问题是,您的正则表达式规则接受在序列之后结束的 URI .../cifs
(即没有尾随的/
),而原始规则阻止它。
所以,
对于第一条规则,当出现时/app/sss/cifs
,nginx
将发出重定向并添加尾随/
(显式或隐式)。
对于第二条规则,此 URI 会传递到上游,也会重定向,但结果会错误。
您可以尝试通过修改正则表达式并添加尾随/
来保护上游cifs
:
location ~ ^/app/(...)/cifs(/.*) { ... }
我已将其放置在捕获内部,以便rewrite
语句相同。
如果这破坏了/app/sss/cifs
URI,您可以明确添加尾随的/
,但添加新规则来处理该特定情况:
location ~ ^(/app/.../cifs)$ { return 302 $1/; }