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

我试图让这两个位置指令在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 

这听起来很熟悉吗? 我在这里错过了什么?

来自Xaviar的一个很好的答案是:

如果你碰巧不熟悉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指令末尾的/

它告诉你,代理指令中的URI不能在正则expression式中使用。 这是因为nginx不能replacelocation块中与正则expression式匹配的URI的一部分,而通过proxy_pass指令传递的是正常的。

简单地想象你的位置正则expression式是/foo/(.*)/bar ,并且你指定了proxy_pass http://server/test ,nginx将必须将你的位置正则expression式映射到另一个上层,因为你不想以/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,所以不能重写redirect以匹配位置块URI模式,使得在重写之前根据初始请求更改Location标头是不可能的。

这个消息非常清楚: proxy_pass在正则expression式指定的location不起作用。 在这种情况下,你必须制定这四条规则,而不是两条。

有关更多选项,请参阅文档 。