Nginx 中使用 location ~* 可实现不区分大小写的正则路径匹配,作用于 URI 路径部分,优先级介于 ^~ 和普通前缀匹配之间,需注意转义特殊字符、避免性能损耗及查询参数不参与匹配。

直接在 location 后加 ~* 修饰符,后面跟 PCRE 正则表达式即可实现不区分大小写的路径匹配。它作用于请求 URI 的路径部分(不含查询参数),匹配成功后立即执行对应块内指令。
基本写法与生效逻辑
~* 是 Nginx 原生支持的修饰符,不需要额外模块或开关。只要正则语法正确,大小写字母自动视为等价。
-
location ~* ^/api/user$ { ... } —— 匹配
/api/user、/API/USER、/ApI/UsEr等所有大小写组合 -
location ~* \.(jpg|png|gif)$ { ... } —— 同时匹配
.JPG、.Png、.GIF - 正则中普通字母无需处理;特殊字符如
.、?、+、( )等需转义(例如字面量点号写成\.)
注意匹配优先级,避免被覆盖
~* 属于正则匹配类,优先级低于 = 和 ^~,但高于普通前缀匹配(如 location /api/)。如果同时存在:
- location ^~ /api/ { ... } —— 会优先进入这个块,~* 块完全不会触发
- location /api/ { ... } —— 这是普通前缀匹配,优先级更低,~* 有机会胜出
- 多个 ~* 块按配置文件中出现的顺序依次尝试,一旦匹配成功就停止后续检查
实用技巧:结合 rewrite 统一路径格式
若希望兼容大小写访问,又保持 URL 标准化(比如全小写),可在 ~* 块中用 rewrite 强制跳转:
- location ~* ^/API/(.*)$ { rewrite ^/API/(.*)$ /api/$1 permanent; }
- 访问
/API/users?sort=name会 301 跳转到/api/users?sort=name(查询参数保留) - 注意
permanent表示 301,也可用redirect(302)做临时跳转
常见误区提醒
实际配置时容易踩坑的地方:
- URI 解码发生在匹配前 —— 请求
/static/%20file.txt实际按/static/ file.txt(含空格)匹配,不是原始编码串 - ~* 不作用于查询参数(
?key=value部分),只看/path/to/xxx - 高频路径(如静态资源、API 入口)慎用 ~*,前缀匹配(
location /static/)性能更优 - 测试时建议用
curl -I或浏览器开发者工具确认响应头和状态码,避免缓存干扰











