这可能是使用正则表达式时的 Nginx 错误吗?

这可能是使用正则表达式时的 Nginx 错误吗?

我正在清理我们的配置,所以我想到使用正则表达式,因为我可以删除大量的行。我想知道为什么新规则无法正常工作或工作方式不同。

下面的规则目前在我们的开发、阶段和生产中。它运行良好。我们有许多看起来像这样的规则,但第二条路径有所不同。

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/cifsnginx将发出重定向并添加尾随/(显式或隐式)。

对于第二条规则,此 URI 会传递到上游,也会重定向,但结果会错误。

您可以尝试通过修改正则表达式并添加尾随/来保护上游cifs

location ~ ^/app/(...)/cifs(/.*) { ... }

我已将其放置在捕获内部,以便rewrite语句相同。

如果这破坏了/app/sss/cifsURI,您可以明确添加尾随的/,但添加新规则来处理该特定情况:

location ~ ^(/app/.../cifs)$ { return 302 $1/; }

相关内容