Nginx location匹配中,修饰符决定匹配类型,正则元字符仅在~或~下生效;=为精确匹配,^~为前缀匹配且终止后续正则检查,~和~启用大小写敏感/不敏感正则匹配。

Nginx 的 location 匹配中,特殊字符不是直接写在 URI 里生效的,而是通过修饰符(如 =、^~、~、~*)和正则表达式共同起作用。关键在于:**修饰符决定匹配类型,正则字符只在 ~ 或 ~* 后才被当作元字符解析**。
修饰符决定匹配逻辑
这些符号写在 location 关键字后面、URI 前面,控制整个匹配行为:
-
=:要求 URI 完全相等,不支持任何通配或正则。比如location = /api只匹配/api,不匹配/api/或/apix -
^~:前缀匹配,且一旦命中就停止后续正则检查。例如location ^~ /static/匹配所有以/static/开头的请求,不管后面有没有~ \.js$这类规则 -
~:启用区分大小写的正则匹配。此时后面的 URI 部分会被当作正则表达式处理 -
~*:启用不区分大小写的正则匹配。比如location ~* \.(png|gif|jpg)$能同时匹配.PNG和.jpg
正则元字符只在 ~ 和 ~* 下有效
当使用 ~ 或 ~* 时,URI 部分才按正则语法解释。常见元字符用法如下:
-
^:匹配 URI 开头。如location ~ ^/admin/只匹配以/admin/起始的路径 -
$:匹配 URI 结尾。如location ~ \.html$匹配所有以.html结尾的请求 -
\.:转义点号,避免被当作“任意字符”。\.css$才能准确匹配.css文件 -
\d+:匹配一个或多个数字。如location ~ ^/user/\d+$匹配/user/123,但不匹配/user/abc -
(jpg|png):用括号+竖线表示“或”。~* \.(jpg|png|gif)$覆盖常见图片格式 -
[a-z]:字符范围。如location ~ ^/v[0-9]/匹配/v1/、/v9/等
不能混用的典型错误
这些写法是无效或容易误解的:
-
location ^~ /api/v\d+:错误。^~是前缀匹配,\d+在这里不会被当作正则,而是字面量字符串,实际只匹配/api/v\d+这个路径(含反斜杠和字母 d) -
location = /user/*:错误。=不支持通配符,*被当成普通字符,只会匹配字面值/user/* -
location /static/*.js:错误。无修饰符时是前缀匹配,*不起作用,这行实际等价于location /static/
优先级影响字符是否生效
即使你写了正确的正则,也可能被更高优先级的规则拦截:
- 如果
location = /login和location ~ /login同时存在,访问/login一定走精确匹配,后面的正则根本不会执行 -
location ^~ /assets/和location ~ \.js$共存时,/assets/main.js会进入前者,不会触发 JS 正则规则 - 正则规则按配置文件中出现顺序匹配,第一个成功即终止,不继续往下找


















