Nginx转发路径匹配优先级

228 阅读1分钟

Nginx转发路径重名优先级问题

当前系统需要使用自己的用户服务,配置Nginx转发时,使用location /sacw/share/oauth2/未能生效

查看配置文件发现 当前系统使用的匹配路径,和公共的转发路径都为/oauth2

公共用户服务转发

location ~ /oauth2/ {
    proxy_pass http://192.168.1.85:30081;
}

其他系统用户服务转发

location /sacw/share/oauth2/ {
    proxy_pass http://192.168.1.89:30511/oauth/;
}

使用以上配置会导致转发时,会匹配公共用户服务的转发,而不再走自己配置的转发

出现原因

/sacw/share/oauth2/ 优先级低于 ~ /oauth2/

问题解析

Nginx转发具有优先级

location 匹配优先级:

  1. 首先精确匹配 =
location = /abc {
   proxy_pass http://192.168.1.88:30511/;
}

只匹配/abc,不匹配/abcd,/abc/

  1. 其次前缀匹配 ^~
location ^~ /data/work/ {
   proxy_pass http://192.168.1.245:30088/work;
}
  1. 其次是按文件中顺序的正则匹配 ~ 或 ~*

    ~ :区分大小写的匹配 ~* :不区分大小写的匹配

location ~ /oauth2/ {
    proxy_pass http://192.168.1.245:30088;
}
  1. 然后匹配不带任何修饰符的一般前缀匹配
location /apple/namss-share {
   proxy_pass http://192.168.1.245:30511/oauth/;
}

匹配任何 /apple/namss-share 开头的地址

  1. 最后是交给 / 通用匹配
location / {
   root   html;
}

总结:

精确= > 前缀^~ > 正则~,~ > 一般 > 通用/*

解决方案

使用前缀匹配

location ^~ /sacw/share/oauth2/ {
    proxy_pass http://192.168.1.89:30511/oauth/;
}