nginx的location正则匹配默认区分大小写(~开头),需用~*或(?i)实现不区分大小写;普通前缀匹配本身不区分大小写,与正则无关;匹配优先级:精确匹配>正则匹配>前缀匹配。

Nginx 的 location 块默认是**不区分大小写**的普通字符串匹配(前缀匹配),但若使用正则表达式,则默认**区分大小写**;要实现不区分大小写的正则匹配,需显式添加标志。
区分大小写的正则匹配(默认行为)
以 ~ 开头的正则 location 是区分大小写的。例如:
location ~ ^/api/USER/ { ... }
该规则只匹配 /api/USER/,但不匹配 /api/user/ 或 /api/User/。
- 必须用
~启动,表示启用 PCRE 正则引擎 - 所有字母、路径字符均按字面大小写严格匹配
- 优先级高于普通前缀匹配(
location /xxx),但低于精确匹配(location = /xxx)
不区分大小写的正则匹配(加 i 标志)
在 ~ 后加上 i(ignore-case),即可忽略大小写:
location ~* ^/api/user/ { ... }
或更明确地写为:
location ~ ^(?i)/api/user/ { ... }
两者效果相同,都可匹配 /api/user/、/API/USER/、/Api/User/ 等任意大小写组合。
-
~*是最常用写法,简洁且语义清晰 -
(?i)是内联标志,适合局部控制(如只让某一段不区分大小写) - 注意:大小写忽略仅作用于正则部分,不改变 URI 解码或变量处理逻辑
常见误区与注意事项
容易混淆的是:location /api/ 这类普通前缀匹配本身就不区分大小写(Nginx 内部对路径比较做了小写归一化),但这和正则无关,属于 Nginx 的默认路径比较策略。
- 不要误以为
location /Api/能匹配/api/—— 实际上它能,因为普通 location 是大小写不敏感的前缀匹配 -
~和~*都是正则匹配,优先级相同(按配置顺序或最长匹配),但~*更宽松 - 避免过度依赖大小写不敏感匹配,可能掩盖路径设计不规范的问题;生产环境建议统一小写路径并用
~显式控制
验证与调试技巧
可通过 nginx -t 检查语法,再用 curl -I 或浏览器访问不同大小写的路径观察响应头中 Server 或自定义响应内容,确认是否命中预期 location。
- 开启
error_log /path/to/log debug;可查看 location 匹配过程(需编译时启用 debug 日志) - 配合
add_header X-Matched-Location "xxx";在各 location 中打标,便于快速定位 - 注意:URI 在进入 location 匹配前已解码,正则应对解码后的路径编写











