Nginx location 匹配优先级:一个让 502 变 404 的反斜杠

举报
yd_216677863 发表于 2026/10/25 10:13:28 2026/10/25
【摘要】 排查一个诡异案例:客户端偶发 404,后端服务日志却显示请求根本没到达。折腾两小时,结论是一个反斜杠引发的路由吞噬。一、location 匹配的完整优先级Nginx 收到请求后按这个顺序找 location:1. 精确匹配 = /api/v1/health 直接命中即止2. 前缀匹配 ^~ 命中后不再看正则3. 正则匹配 ~ 或 ~* 按 configuration 顺序,第一个命中即止4....

排查一个诡异案例:客户端偶发 404,后端服务日志却显示请求根本没到达。折腾两小时,结论是一个反斜杠引发的路由吞噬。


一、location 匹配的完整优先级

Nginx 收到请求后按这个顺序找 location:

1. 精确匹配 = /api/v1/health 直接命中即止

2. 前缀匹配 ^~ 命中后不再看正则

3. 正则匹配 ~ 或 ~* 按 configuration 顺序,第一个命中即止

4. 普通前缀匹配,取最长的那条

常见误解:以为写在前面的 location 优先。顺序只在正则之间有意义。


二、事故还原

配置里有两条:

location /api { proxy_pass http://backend; }

location ~ ^/api/v1/(.*)$ { return 404; }

开发同事加了第二条做旧版接口下线,结果所有 /api/v1/* 全部 404——正则优先级高于普通前缀,proxy_pass 根本没机会执行。


三、修复

location ^~ /api/ { proxy_pass http://backend; }

^~ 让前缀匹配跳过正则检查,一劳永逸。或者把正则改得更精确:^/api/v1/legacy/.*$。


四、调试技巧

- error_log 加 debug 级别,能看到 location 的完整匹配决策链

- curl -H "Host: x" 直接打 Nginx,排除上游干扰

- nginx -T 输出完整合并配置,别看碎片文件猜


五、沉淀

location 的四种匹配模式是四个不同的抽屉,精确、^~、正则、普通前缀——顺序只在同一个抽屉里有效。改配置前先画一遍决策树,比出事后翻日志快得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。