~*修饰符可实现nginx请求路径不区分大小写的正则匹配,适用于静态资源、api及页面入口等明确路径结构场景,原生支持无需额外模块。

直接用 ~* 修饰符就能让 Nginx 对请求路径做不区分大小写的正则匹配,这是最常用、最轻量、也最推荐的方式。
用 ~* 匹配后缀或固定路径段
适用于静态资源、API 路径、页面入口等明确结构的场景。Nginx 原生支持,无需额外模块或重写逻辑。
-
图片/样式/脚本等资源:用
location ~*\.(jpg|jpeg|png|gif|css|js|svg)$,这样/IMG.JPG、/Css/style.CSS都能命中同一规则 -
统一入口页面:比如允许
/About、/ABOUT、/about都指向/main/about.html,可写成:location ~* ^/(about|privacy|terms|contact)$ {<br> alias /var/www/html/main/$1.html;<br>} -
注意 alias 和 root 的区别:若用
alias,末尾斜杠必须匹配;用root则自动拼接完整路径,更稳妥
用 ~* 配合 rewrite 统一转小写(简单重定向)
当需要将大写路径“标准化”为小写并跳转(如 SEO 友好或缓存一致性),可用 if + rewrite 组合,但仅限简单路径,避免嵌套参数混乱。
- 在
server块中添加:if ($uri ~ [A-Z]) {<br> rewrite ^(.*)$ $1 permanent;<br>}
⚠️ 注意:这会触发 301 重定向,浏览器地址栏会变;且不能在location内直接用rewrite ... last处理大小写,因为last会重新进入 location 匹配,可能引发循环 - 更安全的做法是只对特定路径启用:
location /static/ {<br> if ($uri ~ [A-Z]) {<br> rewrite ^(.*)$ /static/$1 permanent;<br> }<br>}
避免踩坑:~* 不等于全局忽略大小写
~* 只控制当前这条 location 规则的匹配行为,它不会改变文件系统本身的大小写敏感性,也不会影响其他 location 或 upstream 行为。
- 如果后端服务(如 MinIO、Tomcat)本身区分大小写,仅靠 Nginx
~*匹配仍可能返回 404 —— 因为匹配成功后,Nginx 仍会原样转发原始 URI(含大写字母)给后端 - 若需真正“转换路径”,得配合
rewrite ... break或proxy_set_header修改传递内容,或改用 Lua(OpenResty)在请求阶段统一小写化$uri -
~*的优先级低于=和^~,但高于普通前缀匹配(如location /api)。多条~*按配置顺序执行,第一条匹配即生效
替代方案对比(什么情况下不用 ~*)
不是所有场景都适合 ~*,尤其当路径结构复杂、参数动态、或需强一致性时:
-
大量自由路径需统一小写 → 推荐
map+rewrite permanent,维护映射表更清晰 -
需在代理前修改 URI(如转小写再发给 MinIO) → 用 OpenResty 的
rewrite_by_lua_block或 Perl 模块 -
只是禁止访问某些带大小写的敏感文件 →
location ~* \.(htaccess|git|svn)$ { deny all; }就足够











