Nginx位置正则表达式不适用于代理通行证


43

我正在尝试使这2个位置指令在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

听起来有人熟悉吗?我在这里想念什么?

Answers:


48

除了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


1
那结尾/解决了我的配置问题,很难理解,谢谢!
yorch

真让我发疯,感谢您指出这一点!
cyrrill

20

它告诉您proxy pass指令中的URI不能在正则表达式位置使用。这是因为nginx无法用以通用方式locationproxy_pass指令中传递的reg替换URI中与正则表达式匹配的部分。

只要想象一下您所在的位置正则表达式是/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根据初始请求更改标头。


2
将路径移入重写规则对我有用。谢谢。
sonjz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.