网上全是错的!Nginx location 匹配逻辑,看这篇就够了
|
admin
2026年5月8日 11:20
本文热度 55
|
Nginx 中最常用也最容易出错的就是 location 配置。网上大部分文章对这部分的讲解都存在错误。其根本原因是 Nginx 在配置友好性上做得并不好,官方文档的描述也较为晦涩,让很多深度使用者都理解错了。
本文将对 location 的匹配规则进行彻底、清晰的梳理。
官方文档参考:
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
一、location 的四种匹配类型
Nginx 的 server 块中可以存在多个 location,每个 location 都有自己的匹配规则。Nginx 会按照以下四种类型进行匹配(仅匹配 URL 的 path 部分,不包含 query_string):
用 = 表示。请求路径必须与 location 完全相等。 示例: (无正则前缀匹配) 用 ^~ 表示。请求路径以 location 为前缀即可匹配,匹配成功后不再进行正则匹配。 示例:(无符号前缀匹配) 没有前缀符号。请求路径以 location 为前缀即可匹配。 示例:用 ~(区分大小写)或 ~*(不区分大小写)表示。请求路径被正则表达式匹配即可。 示例:
二、location 匹配优先级规则
= 完全匹配 优先级最高,一旦匹配成功,立即停止后续所有匹配。
其余匹配规则优先级(最容易混淆的,也是很多文章写错的地方):
- 首先对所有前缀匹配(^~ 和普通前缀匹配)同时进行检查;
- 如果有多个前缀匹配成功,选择匹配字符串最长的那一个(“最长命中”原则),与 location 顺序无关;
- 如果选中的最长前缀匹配是 ^~ 类型,则立即使用它,停止后续正则匹配;
- 如果选中的最长前缀匹配是普通前缀匹配(无 ^~),则继续进行正则表达式匹配;
- 正则表达式按配置文件中出现的顺序依次尝试,只要有一个匹配成功,就立即使用该 location,并停止后续匹配;
- 若正则也没有匹配,则最终使用前面记住的最长前缀匹配。
三、“最长命中”原则示例
location ^~ /a { root /;}location ^~ /aaa { root /aaa;}
请求 /aaa 时,两个 location 都匹配成功; 因为 /aaa 比 /a 更长,所以最终匹配 location ^~ /aaa。
(去掉 ^~ 后结果相同,依然遵循最长匹配原则)
四、综合匹配示例
示例 1:
location /test_1 { return 400;}location ^~ /test { return 401;}
- 请求 /test_1 → 返回 400(说明 ^~ 的优先级并不高于普通前缀匹配,最长匹配原则优先)
示例 2:
location /test_1 { return 400;}location ^~ /test { return 401;}location ~/test { return 402;}
- 请求 /test_1 → 返回 402(此时2种前缀匹配同时进行,找到最长的 location /test_1,此 location 无 ^~ 前缀,所以不阻断正则,最终正则匹配成功)
- 请求 /test → 返回 401(找到最长的 location ^~ /test,有 ^~ 前缀,阻断正则匹配)
作者简介:从事 Web 前后端开发多年。一直相信“技术应该被说人话”,坚持输出实用易懂的干货内容。闲暇写些随笔,记录行业观察与生活感悟。
阅读原文:点击这里
该文章在 2026/5/8 11:20:54 编辑过