= 精确匹配是 Nginx location 中优先级最高的规则,要求 URI 字符串完全一致(区分大小写、忽略查询参数、不处理 URL 解码),匹配即终止后续查找。

Nginx 的 = 精确匹配是 location 匹配中优先级最高的规则,它要求请求的 URI 必须**完全一致**(不带查询参数,也不做任何内部重写或路径规范化),才能命中。用对了能高效拦截特定请求,避免被其他更宽泛的 location 覆盖。
什么是 = 精确匹配?
= 是 Nginx location 指令中最严格的匹配方式。它只匹配**完全相等**的 URI 字符串,区分大小写,且不处理 query string(即 ? 后面的部分)。只要 URI 字符串和配置中写的值一字不差,就立即匹配并停止后续 location 查找。
- 例如:
location = /api/status只匹配GET /api/status,不匹配/api/status/、/api/status?ts=1或/api/status/health - 它比
^~、正则~和普通前缀匹配都优先 - 一旦匹配成功,Nginx 不再检查其他 location 块
怎么写一个有效的 = 匹配规则?
语法很简单,但要注意 URI 格式和上下文:
- 写法:
location = /exact/path - URI 必须以
/开头(即使你访问的是根路径,也要写location = /) - 不要加尾部斜杠(除非你要匹配的就是带斜杠的路径,比如
location = /login/) - 不能包含正则元字符(
=匹配不支持正则,所以.*、\d+这类写法会直接报错)
示例配置:
location = /health {
return 200 "OK";
}
location = / {
return 200 "Root hit";
}
location / {
proxy_pass http://backend;
}
这里 /health 和 / 都会被精确匹配,不会落到后面的 / 前缀匹配里。
常见误用与避坑点
= 看似简单,但几个细节容易出错:
-
查询参数不影响匹配:
location = /login会匹配/login?next=/admin,因为 Nginx 在 location 匹配阶段忽略 query string -
不处理 URL 解码:如果客户端发送
/api%2Fv1(即/api/v1编码后),location = /api/v1不会匹配它;需确保客户端发来的 URI 和配置完全一致 -
注意内部重定向干扰:如果前面有
rewrite或try_files导致 URI 改变,=匹配的是改写后的 URI,不是原始请求路径 -
别和
alias混用出错:在=块里用alias要格外小心路径拼接,推荐用root+index或直接return/proxy_pass
实战:用 = 拦截敏感路径或健康检查
典型用途是快速响应特定管理接口,避免走复杂逻辑:
- 屏蔽恶意探测:
location = /wp-login.php { return 403; } - 暴露轻量健康端点:
location = /ready { add_header Content-Type text/plain; return 200 "ready"; } - 强制跳转首页:
location = /home { return 302 /; }
这些规则放配置最前面也没关系,因为 = 本身就拥有最高优先级,位置不影响匹配顺序。


















