Nginx 位置正则表达式不适用于代理传递

Nginx 位置正则表达式不适用于代理传递

我正在尝试让这两个位置指令在 Nginx 中工作,但是在启动 Nginx 时出现一些错误。

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

这是我收到的错误:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

听起来熟悉吗?我遗漏了什么?

答案1

对来自的优秀答案的一个小补充沙维尔

如果您恰好对 nginx 不太熟悉,那么在指令末尾添加斜线有一个重要的区别proxy_pass

下列才不是工作:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

但是这个确实如此:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

不同之处在于指令/的末尾proxy_pass

答案2

它告诉你URI代理传递指令中的 不能在正则表达式位置中使用。这是因为 nginx 无法以通用方式location将块中与正则表达式匹配的 URI 部分替换为指令中传递的部分。proxy_pass

简单想象一下,您的位置正则表达式是/foo/(.*)/bar,并且您指定proxy_pass http://server/test,nginx 必须将您的位置正则表达式映射到上一级的另一个,因为您不想以结尾,/foo/test/bar/something而是以结尾/test/something。所以这在本机是不可能的。

因此,对于这部分,使用以下命令应该有效:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

但是,无法重写重定向以匹配位置块 URI 模式,因为它会重写正在处理的当前 URI,从而无法Location根据初始请求重写之前。

相关内容