nginx location匹配严格按优先级顺序执行:先=精确匹配,再^~前缀匹配,然后~或~*正则顺序匹配,最后普通前缀最长匹配。

Nginx 的 location 匹配不是看配置文件里谁写在前面,而是严格按四类语法的内在优先级执行:先精确匹配,再前缀禁正则,然后正则顺序匹配,最后才是普通前缀兜底。理解这个顺序,才能避免静态资源 404、API 路径被意外拦截、重定向跳转错乱等问题。
= 精确匹配:最高优先级,命中即停
只响应完全一致的 URI,不接受尾部斜杠、子路径或查询参数干扰。
-
location = /api只匹配/api,不匹配/api/、/api/users或/api?x=1 - 一旦匹配成功,Nginx 立即采用该块,跳过所有后续 location 判断(包括更长前缀和任何正则)
- 典型用途:
location = /、location = /favicon.ico、location = /healthz
^~ 前缀匹配:非正则、最长即止、禁止正则回溯
纯字符串前缀比较,不支持正则元字符(如 .、*、$),但性能高、行为确定。
-
location ^~ /static/匹配/static/css/app.css、/static/images/logo.png等所有以该路径开头的请求 - 只要它成为当前 URI 的最长前缀匹配项,就直接生效,不再检查任何
~或~*正则规则 - 若同时存在
location ^~ /static/和location ^~ /static/css/,后者因更长而优先生效
~ 和 ~* 正则匹配:按配置顺序逐条尝试,首个命中即用
它们不参与第一阶段的前缀比对,而是在前缀匹配完成后才轮询;且只在没有被 = 或 ^~ 截断时才会触发。
-
~区分大小写,~*不区分;多数静态资源后缀推荐用~*,例如location ~* \.(js|css|png|jpg)$ - 匹配顺序严格依赖配置文件中出现的上下文位置:上面的规则先试,命中就停,后面的正则不会执行
- 举例:
/static/logo.PNG会被location ^~ /static/拦截,根本不会走到~* \.png$这一步
普通前缀匹配(无修饰符):最长优先,但整体优先级最低
这是最基础的匹配方式,靠 URI 前缀长度决胜,但仅在更高优先级规则全部未命中时才启用。
-
location /admin和location /admin/user同时存在时,请求/admin/user/settings会命中后者 - 但它无法压过正则:即使
location /api比某个location ~ ^/api/.*$更长,只要正则排在前面且能匹配,就会被选中 - 兜底常用:
location /会捕获所有未被其他规则覆盖的请求











