nginx路径匹配的优先级
在 Nginx 配置中,当请求 /portal/agent/sse
时,会匹配 location ~* /sse$
规则,而不是 location /portal
。原因如下:
匹配规则解析
-
location ~* /sse$
~*
表示 不区分大小写的正则匹配/sse$
表示以/sse
结尾的路径- 匹配结果:
/portal/agent/sse
以/sse
结尾,符合该规则
-
location /portal
- 普通前缀匹配
- 虽然路径包含
/portal
,但优先级低于正则匹配
Nginx 的 location 优先级顺序
- 精确匹配
location = /path
(最高优先级) - 正则匹配
location ~ /pattern
(按配置文件中的顺序) - 前缀匹配
location /prefix
(按最长前缀匹配) - 通用匹配
location /
(最低优先级)
验证方法
在 Nginx 配置中添加日志验证:
location ~* /sse$ {
access_log /var/log/nginx/sse.log;
# ...其他配置...
}
location /portal {
access_log /var/log/nginx/portal.log;
# ...其他配置...
}
请求 /portal/agent/sse
后检查日志文件,会发现记录在 sse.log
中。
强制走 /portal
的方法
如果希望 /portal/agent/sse
匹配到 location /portal
,需调整配置:
location ^~ /portal { # ^~ 表示禁止后续正则匹配
# 处理所有以 /portal 开头的路径(包括 /portal/agent/sse)
# 优先级高于正则匹配
}
关键结论
- 当前配置下,
/portal/agent/sse
会匹配location ~* /sse$
- 如果需要改变匹配行为,需调整正则表达式或使用
^~
强制前缀匹配优先:location ^~ /portal { # 强制前缀匹配优先于正则 }