Nginx location匹配按三阶段执行:先精确匹配(=),命中即停;再找最长前缀,若含^~则跳过正则;最后仅当最长普通前缀无^~时,才按序检查~和~*正则。

掌握 Nginx 的 location 匹配优先级,关键不是死记“精确 > 优先前缀 > 正则 > 普通前缀”这个排序,而是理解它背后的真实匹配流程——Nginx 不是按书写顺序逐行扫描,而是分阶段、有逻辑地筛选。
先找精确匹配(=),命中就停
只要请求 URI 和 location = /path 完全一致(不看 query string,不接受末尾斜杠或额外字符),就立刻采用该配置,后续所有 location 都不再检查。
-
location = /api→ 只匹配/api,不匹配/api/、/apix、/api?k=v(query string 被忽略,但路径必须一字不差) - 哪怕配置文件里它写在最底下,只要请求能精确命中,它就赢了
再比最长前缀,带 ^~ 就截断正则
没找到 = 匹配时,Nginx 会收集所有普通前缀 location(包括 ^~ 和无修饰的),挑出 URI 最长的那个作为“候选”。但注意:^~ 是个“刹车键”——一旦它成为最长匹配,Nginx 立刻终止后续所有正则匹配,直接用它。
-
location ^~ /static/和location /static/css/同时存在,请求/static/css/main.css→ 后者更长,但它是普通前缀,所以还会继续查正则;而前者虽短,但带^~,只要匹配上(比如请求/static/xxx),就跳过正则 -
location ^~ /img匹配/img/logo.png,即使后面有location ~ \.png$,也不会执行
正则匹配只在必要时才跑,且按定义顺序
只有当“最长普通前缀匹配”(即不带 ^~ 的那个)被选中,且它没加 ^~,Nginx 才会从上到下逐条检查 ~ 和 ~* 正则,遇到第一个能匹配的就用,不再往后看。
- 配置顺序很重要:
location ~ \.(jpg|jpeg)$写在前面,就比后面同功能的location ~ \.jpg$优先 - 大小写敏感性要明确:
~ \.JPG$不会匹配.jpg,而~* \.jpg$两者都行 - 如果最长前缀是
location /admin,而请求是/admin/login,且没有^~,那正则才有机会介入
普通前缀(无修饰)是兜底,但最容易被覆盖
location / 或 location /blog 这类写法,本质是“最长前缀匹配”的一部分。它们本身优先级最低,但因为所有路径都以 / 开头,常被误认为“万能兜底”。实际中它只在没其他更长、更严格匹配时才生效。
-
location /会被location = /、location ^~ /api、location ~ \.php$全部压倒 -
location /files和location /files/download共存 → 请求/files/download/log.txt会进后者,因为更长 - 别指望靠它做默认处理,真要兜底,建议用
location / { try_files $uri @fallback; }配合命名 location










