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 匹配优先级:
- 首先精确匹配 =
location = /abc {
proxy_pass http://192.168.1.88:30511/;
}
只匹配/abc,不匹配/abcd,/abc/
- 其次前缀匹配 ^~
location ^~ /data/work/ {
proxy_pass http://192.168.1.245:30088/work;
}
-
其次是按文件中顺序的正则匹配 ~ 或 ~*
~ :区分大小写的匹配 ~* :不区分大小写的匹配
location ~ /oauth2/ {
proxy_pass http://192.168.1.245:30088;
}
- 然后匹配不带任何修饰符的一般前缀匹配
location /apple/namss-share {
proxy_pass http://192.168.1.245:30511/oauth/;
}
匹配任何 /apple/namss-share 开头的地址
- 最后是交给 / 通用匹配
location / {
root html;
}
总结:
精确= > 前缀^~ > 正则~,~ > 一般 > 通用/*
解决方案
使用前缀匹配
location ^~ /sacw/share/oauth2/ {
proxy_pass http://192.168.1.89:30511/oauth/;
}