~修饰符表示区分大小写的正则匹配,启用PCRE引擎,严格区分大小写(如/API≠/api);匹配顺序在=和^~之后,按配置文件自上而下执行,首个成功匹配即终止,特殊字符需转义,不自动解码URI编码。

在 Nginx 中,~ 修饰符用于定义区分大小写的正则匹配 location 块。它会启用 PCRE 正则引擎,并严格区分字母大小写,比如 /API 和 /api 被视为两个不同路径。
基本写法和语法结构
location 指令必须以 ~ 开头,后接一个合法的正则表达式(无需引号),整个 URI 部分就是正则模式:
-
location ~ ^/user/[0-9]+/profile$ { ... }—— 匹配/user/123/profile,但不匹配/USER/123/PROFILE -
location ~ \.php$ { ... }—— 匹配以.php小写结尾的请求,.PHP或.Php不匹配 -
location ~ /admin/[A-Z]{3}/—— 只匹配像/admin/ABC/这样的路径,/admin/abc/不生效
注意匹配顺序和优先级
~ 类型属于正则匹配类,在 Nginx 的 location 匹配流程中,它排在 =(精确)和 ^~(前缀阻断)之后,且按配置文件中出现的先后顺序执行(首个成功匹配即终止):
- 如果前面已有
^~ /static/匹配了/static/logo.png,后面的~ \.(png|jpg)$就不会被检查 - 若多个
~块并存,Nginx 从上到下逐条尝试,一旦某条正则匹配成功,立即使用其配置,不再继续 - 不能与
=或^~混用在同一 location 行,语法错误
常见误用和避坑点
区分大小写正则看似简单,但容易因路径编码、斜杠处理或转义不到位导致失效:
- 正则中的特殊字符如
.、$、^、/必须转义,例如匹配.js要写成\.js$,否则.会被当作“任意字符” - URI 中的百分号编码(如空格变成
%20)不会被自动解码,正则应针对原始编码字符串编写,如匹配含空格路径需写%20而非 - 末尾斜杠影响匹配:
~ ^/api可匹配/api、/apix、/api/v1;若只想匹配目录,建议加/或锚定:~ ^/api/$
对比 ~* 和实际选型建议
当业务明确要求大小写敏感时才用 ~;多数静态资源、接口路由其实更适合 ~*(不区分大小写),更健壮:
- 前端常发
/Assets/main.css,后端又部署为/assets/main.css—— 用~*可避免 404 - 管理后台 URL 如
/Admin/Dashboard若强制大小写,用户手输小写就失败,体验差 - 真正需要区分的场景较少,典型如:OAuth 回调路径含大小写敏感 token、特定 API 版本标识(
/v2/Post≠/v2/post)


















