nginx location匹配遵循精确匹配(=)→前缀匹配(^~)→正则匹配(~、~*)→普通前缀匹配的优先级顺序,匹配成功即终止;精确匹配要求uri完全相等,^~跳过正则检查,正则按配置顺序逐条尝试,普通前缀取最长路径。

请求路径在 Nginx 的 location 块中不是按书写顺序匹配,而是严格遵循一套固定优先级逻辑——越精确、越确定的规则越先被采用,匹配成功即终止后续查找。
精确匹配(=)优先级最高
当 URI 完全等于指定路径时触发,不带查询参数、不允许多余字符(包括尾部斜杠)。一旦命中,立刻执行对应配置,不再检查其他 location。
-
location = /login { return 200 "exact"; }只响应/login,不响应/login/或/login?next=/ - 常用于首页、登录页、健康检查端点等明确路径,避免被更宽泛规则覆盖
前缀匹配中带 ^~ 的规则会跳过正则检查
^~ 表示“以该前缀开头且不进入正则阶段”。它比普通前缀匹配优先,也高于所有正则匹配(~ 和 ~*),但低于精确匹配。
-
location ^~ /static/ { alias /var/www/static/; }匹配/static/css/app.css,即使后面有location ~ \.css$也不会生效 - 适合高频静态资源目录,兼顾性能与确定性,防止正则误捕获或顺序依赖问题
正则匹配按配置顺序逐条尝试
~(区分大小写)和 ~*(不区分大小写)属于同一优先级层级,但 ~ 略高于 ~*;它们在精确匹配和 ^~ 之后才参与匹配,且只在没有更高优先级规则命中时启用。
- 匹配从上到下扫描,第一条满足正则的即生效,后续正则不再检查
- 例如:
location ~* \.(jpg|png)$放在location ~ \.PHP$下方,就可能被后者拦截,需注意顺序 - 适合扩展名、API 版本号、动态路由片段等需模式识别的场景
普通前缀匹配走最长路径原则
无修饰符的 location /path 属于“最长前缀匹配”:Nginx 会收集所有能匹配当前 URI 的前缀规则,选其中 URI 最长的那个。若长度相同,则取配置文件中靠前的那条。
-
location /api/v1/和location /api/同时存在时,/api/v1/users会命中前者 -
location /是兜底规则,只要没被前面任何规则捕获,最终都会落到它身上 - 注意:
location /abc实际会匹配/abc、/abc/、/abcde,如需严格限定,应写成location /abc/或配合=











