用 ~* 修饰符可实现 nginx url 不区分大小写的正则匹配,适用于静态资源、固定页面路由等场景,但不改变后端路径大小写,需配合 rewrite 或 lua 模块才能真正转换 uri。

用 ~* 修饰符就能让 Nginx 对 URL 路径做不区分大小写的正则匹配,这是最直接、原生支持、无需额外模块的方式。
用 ~* 匹配固定路径或后缀
适用于静态资源、API 入口、页面路由等结构清晰的场景:
- 匹配图片、样式、脚本等资源:
location ~*\.(jpg|jpeg|png|gif|css|js|svg)$ { ... }
这样
/IMG.JPG、/Css/style.CSS都能命中同一规则 - 统一入口页面(如 about、terms):
location ~* ^/(about|privacy|terms|contact)$ { alias /var/www/html/main/$1.html; }
注意:
alias要求路径拼接严格,建议优先用root+index避免斜杠问题
用 ~* 配合 if + rewrite 实现小写重定向
当需要把大写路径标准化为小写并跳转(例如 SEO 或缓存一致),可限定范围使用重定向:
- 只对特定前缀启用,降低风险: location /static/ { if ($uri ~ [A-Z]) { rewrite ^(.*)$ /static/$1 permanent; } }
- ⚠️ 不要在 location 块内直接用
rewrite ... last处理大小写,否则可能触发循环匹配 - 该方式会返回 301,浏览器地址栏会变化;原始 URI 含大写字母仍会原样转发给后端
注意 ~* 的作用边界和常见误区
~* 只控制当前这条 location 的匹配行为,不是全局忽略大小写:
- 它不会改变文件系统或后端服务本身的大小写敏感性。比如匹配成功后,Nginx 仍会把原始 URI(含大写)原样发给 Tomcat 或 MinIO —— 若后端不认大写路径,依然返回 404
- 若需真正“转换路径”再转发,得配合
rewrite ... break修改$uri,或用 OpenResty 的rewrite_by_lua_block在代理前统一小写化 - 优先级上,
~*属于正则匹配,低于=和^~,高于普通前缀匹配(如location /api);多条~*按配置顺序执行,第一条匹配即生效
什么情况下不适合单靠 ~*
不是所有需求都适合仅用 ~* 解决:
- 路径结构复杂、含大量动态参数时,正则难维护 → 推荐用
map预定义映射表,再配合rewrite permanent - 必须在代理前修改 URI(如强制转小写发给对象存储)→ 用 OpenResty 或 Perl 模块,在请求阶段处理
- 只需匹配、无需改 URI(比如只做日志或限流)→
~*完全够用,不需额外操作











