Nginx location匹配按=、^~、正则、普通前缀严格优先级执行:=精确匹配最高且立即终止;^~最长前缀匹配后阻断正则;正则按书写顺序首个命中即用;普通前缀可能被后续正则覆盖。

nginx 的 location 匹配不是“谁写在前面就用谁”,而是有一套严格、可预测的优先级逻辑。理解它,才能避免配置生效异常、静态资源 404、API 被错误代理等问题。
精确匹配(=):最高优先级,一击即中
修饰符 = 表示 URI 必须完全一致,多一个字符、少一个斜杠都不行。一旦匹配,立刻执行,不查其他任何 location。
- 例如
location = /api只匹配https://example.com/api,不匹配/api/、/api/users或/v1/api - 适合关键入口点:如健康检查路径
location = /healthz { return 200 "OK"; } - 注意:不能带尾部斜杠,
location = /admin/不等于location = /admin,二者互不匹配
前缀匹配(^~):阻断正则,专注最长前缀
修饰符 ^~ 是普通字符串前缀匹配,但带“阻断”能力——只要它被选为最长前缀匹配结果,Nginx 就不再检查任何正则 location(~ 或 ~*)。
- 常用于静态资源目录,比如
location ^~ /static/ { root /var/www; },确保所有/static/xxx.js都走文件系统,不被后续的~ \.js$正则干扰 - 它仍遵循“最长前缀”原则:若同时存在
^~ /static/和^~ /static/css/,请求/static/css/main.css会命中后者 - 与普通前缀(无修饰符)不同,
^~不会“让位”给正则;而普通前缀会先记住,再看有没有正则能覆盖它
正则匹配(~ 和 ~*):按顺序扫描,首个命中即止
以 ~(区分大小写)或 ~*(不区分大小写)开头的 location,属于正则匹配。它们不参与“最长前缀”比对,只在普通 location 初步筛选后,按配置文件中的书写顺序依次尝试。
- 例如:
location ~ \.(jpg|jpeg|png)$ { ... }和location ~* \.pdf$ { ... },若请求是/doc/Report.PDF,第二个会命中(因~*不区分大小写且顺序靠后) - 正则匹配没有“更精准”的概念,只看“第一个成功匹配”——所以把宽泛规则(如
~ .*)放在前面,会直接截断后续所有正则 - 常见用途:按扩展名分发静态资源、重写特定 API 路径、屏蔽恶意 UA 等
普通前缀匹配(无修饰符):默认兜底,但可能被正则覆盖
像 location /api/ { ... } 这类没有修饰符的配置,属于普通前缀匹配。它本身优先级低于 = 和 ^~,但高于通用匹配 location /。
- 它先参与“最长前缀”评选,选出最匹配的一个(比如
/api/v2/比/api/更长,就选前者) - 但这个结果只是“暂存”——Nginx 接着会从上到下扫描所有正则 location,只要有一个匹配,就弃用刚才选的前缀,改用正则块
- 因此,若你写了
location /images/又写了location ~* \.(gif|png)$,那么/images/logo.png实际走的是正则块,而非前缀块


















