Nginx中应使用~*修饰符匹配不区分大小写的文件后缀,需转义点号、加行尾锚定$,并置于^~和=之后、location /之前以确保优先级;多后缀可分组配置差异化缓存与压缩策略。

在 Nginx 中,用正则表达式匹配文件后缀(如 .jpg、.png、.js)并统一配置,是优化静态资源处理的常见需求。关键在于正确使用带 ~* 的正则 location,并避免与前缀匹配(location /)产生冲突。
用 ~* 写不区分大小写的后缀匹配
~* 是 Nginx 中最常用、最安全的正则 location 修饰符,它不区分大小写,适合匹配 .JPG、.Js 等变体:
location ~* \.(jpg|jpeg|png|gif|js|css|woff2?|ttf|eot|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary Accept-Encoding;
}说明:
- 反斜杠
\.是必须的,否则点号会被当作正则通配符; - 括号内用竖线
|分隔多个后缀,注意不要漏掉常见变体(如jpeg和woff2); - 结尾的
$很重要,防止误匹配路径中含后缀的目录名(例如/assets/js/不会触发); - 该块会优先于普通前缀 location(如
location /),但低于精确匹配(= /index.html)和长前缀匹配(location ^~ /static/)。
避免 location 顺序和继承问题
Nginx 按照配置顺序查找匹配,但最终生效的是“最优匹配”,不是“最先匹配”。所以不能依赖书写顺序覆盖规则。常见陷阱:
- 如果上面写了
location / { ... },又在下面写location ~* \.js$,后者仍会生效(因为正则优先级高于普通前缀); - 但如果写了
location ^~ /static/,而请求是/static/app.js,那么^~块会优先生效,正则 location 就不会触发; - 想确保某类后缀走正则规则,建议把正则 location 放在所有
^~和=块之后、普通location /之前,逻辑更可控。
按后缀分组做差异化配置(可选进阶)
如果不同后缀需要不同行为(比如图片启用压缩,JS/CSS 启用 Brotli),可以拆成多个正则 location:
# 图片类:启用 WebP 自适应 & 长缓存
location ~* \.(jpg|jpeg|png|gif|webp)$ {
add_header Vary Accept;
expires 1y;
}
<h1>JS/CSS:启用 Brotli + Gzip 双压缩</h1><p>location ~* .(js|css|json)$ {
gzip on;
brotli on;
expires 1h;
}</p><h1>字体:禁止代理缓存,只本地缓存</h1><p>location ~* .(woff|woff2|ttf|eot|otf|svg)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
expires 1y;
}</p>注意:多个正则 location 之间互不影响,Nginx 会为每个请求只匹配一个最优的正则块(按最长匹配字符串原则,不是按书写顺序)。
验证是否生效的小技巧
改完配置别急着 reload,先检查语法再观察行为:
- 运行
nginx -t确保语法无误; - 用
curl -I https://example.com/test.js查看响应头是否有Cache-Control或Expires; - 访问一个不存在的后缀(如
.xyz),确认没被意外匹配; - 查看 Nginx error log(
error_log /path/to/error.log notice;),开启notice级别能看到 location 匹配日志(需编译时启用--with-debug,生产环境慎用)。











