我正在尝试让这两个位置指令在 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
根据初始请求重写之前。