我试图让这两个位置指令在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
不起作用。 在这种情况下,你必须制定这四条规则,而不是两条。
有关更多选项,请参阅文档 。