连载中 3/15

location 匹配规则:优先级搞错,路由全乱

2026-09-23 · 16 阅读 · 0 评论 · 0 赞

五种匹配语法

location 后面跟的那一串决定了匹配方式,五种语法各一句话:= /path 精确匹配(URI 一字不差才算);^~ /path 前缀匹配+截断正则(命中就不再试正则);~ pattern 正则区分大小写;~* pattern 正则不区分大小写;/path 普通前缀匹配(最长优先,但会被正则截胡)。

优先级铁律

location = /health { return 200 "ok"; }        # ① 精确匹配:命中即停
location ^~ /static/ { root /data/www; }       # ② ^~:前缀命中后跳过正则
location ~* .(jpg|png|css|js)$ {              # ③ 正则:按书写顺序取第一个命中
    root /data/www;
    expires 7d;
}
location /api/ { proxy_pass http://backend; }  # ④ 普通前缀:最长优先
location / { proxy_pass http://backend; }      # ⑤ 兜底
#
# 完整顺序:先找最长前缀并记住 → 若是 ^~ 直接用它,结束
#          否则按顺序试正则,第一个命中的赢,结束
#          正则全没中,用刚才记住的前缀
# 注意:① 一旦精确命中,整个匹配立即结束,谁都不用比

背不下来就记一句"精确称王,^~ 截断正则,正则按序,前缀比长"。这条链决定了你配置的先后顺序——正则块之间的顺序是有语义的,别乱排。

两个经典的坑

坑一:正则顺序反了。想拦截所有 .php 直接 403,但这条正则写在前面,导致 /static/xxx.php 也被它吃掉,静态资源 403——把拦截规则放最后,或者用 ^~ 让静态前缀先截断正则。坑二:以为前缀最长就赢。location /static/ 匹配了 /static/logo.png,但一条 location ~ .png$ 会截胡它——除非前者写成 ^~。静态资源块用 ^~ 是实践里的标准姿势。

调试:命中了哪一条

想验证某 URI 落在哪个 location,最快的土办法:在各 location 里临时加 add_header X-Debug loc1 always; 然后用 curl -I 看响应头;正式手段是 error_log 开 debug 级看匹配过程。404 排查也顺着这条路:先确认命中了哪个 location,再看 root/alias 拼出的最终路径对不对——下一篇就讲反向代理里同样的"路径拼接"学问。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#location匹配#优先级#正则匹配#前缀匹配#路由规则

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10101 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9873 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9294 阅读 · 21 评论 · 287 赞