精准匹配(=)优先级最高,命中即停;其次是最长前缀匹配,其中^~匹配后跳过正则,普通前缀则继续匹配首个正则;最后是location /。

精准匹配、前缀匹配和正则匹配是 Nginx location 配置的核心机制,它们的写法和优先级直接影响请求路由是否准确。关键不在于“能写出来”,而在于“写对顺序、用对修饰符、避开常见冲突”。
精准匹配:用 = 限定唯一路径
只匹配完全一致的 URI,不带尾部斜杠、不带查询参数、不分大小写(URI 本身区分大小写,但 = 不做大小写转换)。一旦命中,立刻终止匹配,不检查其他 location。
-
写法示例:
location = /login { return 200 "Login page"; } - 仅响应
GET /login,不响应/login/、/login?next=/home或/Login - 适合 favicon、健康检查接口、固定跳转页等明确无歧义的路径
前缀匹配:分普通前缀与“禁正则”前缀
前缀匹配按 URI 开头判断,Nginx 会选**最长匹配**的规则。但要注意两种写法行为不同:
-
普通前缀(无修饰符):
location /api/ { proxy_pass http://backend; }匹配/api、/api/users、/api/v1/xxx;匹配后仍会继续检查正则 location -
禁正则前缀(^~):
location ^~ /static/ { root /var/www/static; }匹配/static/css/app.css等所有以/static/开头的请求;一旦匹配,**跳过所有正则 location**,避免静态资源被误交由 PHP 或 rewrite 处理
正则匹配:用 ~ 或 ~* 按模式筛选
正则在前缀匹配之后执行,按配置文件中出现的**从上到下顺序**匹配,首个成功即生效,不再往后查。区分大小写需显式指定。
-
大小写敏感:
location ~ \.php$ { fastcgi_pass php-fpm; } -
大小写不敏感:
location ~* \.(js|css|png|jpg)$ { expires 1h; } - 注意:正则中的
$表示结尾,\.要转义点号;避免写~ /admin这类宽泛表达式,易误匹配
匹配优先级不是“谁写在前面谁先”,而是有固定顺序
Nginx 实际执行时严格按以下层级判断(从高到低):
- 精确匹配(
=)→ 命中即停 - 最长前缀匹配(含
^~和无修饰符的/path)→ 先找出所有前缀匹配中 URI 最长的那条 - 若最长前缀是
^~,直接使用,不查正则 - 若最长前缀是普通前缀(如
/api/),则继续按顺序扫描正则 location,取第一个匹配项 - 最后才 fallback 到
location /


















