为什么NGINX中存在以下规则冲突?

时间:2012-08-26 17:25:51

标签: nginx

我有这两条规则:

    location ~* ^.+\.(jpg|jpeg|gif|css|js|png)$ {
        proxy_pass http://127.0.0.1:44843$request_uri;
    }

    location /pc {
        proxy_pass http://127.0.0.1:12345$request_uri;
    }

URI:

/pc/asser/somefile.js

属于第二条规则,为什么?

这是“location / pc”规则优先级较低的问题吗?

3 个答案:

答案 0 :(得分:1)

Nginx documentation定义它:

指令按以下方式处理:

  • 首先处理完全匹配的字符串。如果找到匹配项,nginx将停止搜索并完成请求。
  • 接下来处理剩余的文字字符串指令。如果使用“^〜”参数,那么ngnix将停在此处并完成请求。否则,nginx继续处理位置指令。
  • 处理由正则表达式指定的所有位置指令(带有〜和〜*参数)。如果正则表达式与请求匹配,则nginx在此处停止并完成请求。
  • 如果没有正则表达式,或者没有正则表达式匹配,则使用最具体的文字字符串匹配。

所以你也应该为/ pc使用正则表达式:

location ~ /pc/.* {
  proxy_pass http://127.0.0.1:12345$request_uri;
}

答案 1 :(得分:0)

首先使用前缀字符串(前缀位置)定义的nginx检查位置。 然后,它会按照它们在配置文件中的出现顺序检查使用正则表达式定义的位置。

答案 2 :(得分:0)

http://nginx.org/en/docs/http/ngx_http_core_module.html#location指定查看nging位置指令的顺序:

To find a location matching a given request, nginx first checks locations defined  
using the prefix strings (prefix locations). Among them, the most specific one is 
searched.

这里的问题基本上是前缀位置总是优先于正则表达式

因此,在您的配置中,如果两个块都匹配,则它是/ pc前缀优先级