Nginx 通过 ~* 修饰符实现 location 块的不区分大小写正则匹配,用于柔性过滤文件后缀或路径关键词;需转义点号、添加 $ 锚定结尾,并注意匹配顺序与优先级规则。

Nginx 的 location 块本身不支持原生的“不区分大小写正则匹配”,但可以通过在正则表达式前加 ~* 修饰符来实现不区分大小写的 PCRE 正则匹配,从而完成文件后缀、路径关键词等的柔性过滤。
使用 ~* 开启不区分大小写正则匹配
Nginx 中 location 的正则匹配有三种写法:
-
~:区分大小写的正则匹配(默认) -
~*:不区分大小写的正则匹配(关键!) -
^~:前缀匹配,非正则,且优先级高于正则(不适用本场景)
要过滤所有大小写变体的图片文件(如 .JPG、.png、.GIF),可这样写:
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}常见文件过滤场景示例
以下是一些实用的不区分大小写正则过滤写法:
- 屏蔽所有大小写形式的 .php 文件访问(防止脚本执行):
location ~* \.php$ { return 403; } - 允许但强制小写重定向(需配合 rewrite):
location ~* \.(JPG|PNG|GIF)$ { rewrite ^(.*)$ $1 permanent; }(注意:实际需用map或更严谨逻辑处理大小写转换) - 匹配含特定关键词的静态资源(忽略大小写):
location ~* /(css|js|fonts|assets)/.*\.(ttf|woff2?|eot)$ { ... }
注意事项与避坑点
正则 location 匹配有优先级规则,容易出意料结果:
-
~*和~的优先级相同,但都低于=精确匹配和^~前缀匹配 - 多个
~*location 会按配置文件中出现的**顺序匹配第一个成功项**,不回溯 - 正则中的点号
.必须转义为\.,否则匹配任意字符 - 结尾的
$很重要——防止/logo.png?v=123被误判为非静态资源(若无$,\.png会匹配到?v=123前的部分,仍生效;加上$可确保只匹配以 .png 结尾的 URI)
进阶:结合 map 实现大小写归一化(可选)
如果真需要统一转小写(比如做日志归类或重定向),Nginx 本身不支持正则替换大小写,但可用 map + rewrite 组合模拟:
map $uri $lower_uri {
~^(?<pre class="brush:php;toolbar:false;"fix>.*/)(?<ext>[A-Z]+)$ $prefix${lower_ext};
default $uri;
}
# 注:Nginx 原生 map 不支持动态 lowercase,此写法仅示意逻辑;真实需求建议在应用层或 CDN 处理,或用 Lua 模块(如 OpenResty)纯 Nginx 场景下,~* 已覆盖绝大多数不区分大小写的过滤需求,无需过度复杂化。


















