nginx中为带哈希的js/css/图片等资源设长期缓存,需用正则精准匹配后缀、配置expires 1y与cache-control "public, immutable, max-age=31536000",禁用etag,并排除html等无哈希文件。

在 Nginx 中为图片和脚本设置长期缓存,核心不是简单加个 expires 1y,而是让浏览器真正“信得过”这些资源不会变——这需要文件名带哈希 + 精准匹配 + 响应头协同生效。
按文件稳定性精准匹配资源类型
别用 location / 或模糊路径,必须用正则明确锁定目标后缀,避免误缓存 HTML 或接口响应:
- 脚本(JS)和样式(CSS):用
location ~* \.(js|css)$,只匹配带哈希的构建产物(如app.8a2b3c.js) - 图片(PNG/JPG/WebP/SVG/ICO):用
location ~* \.(png|jpg|jpeg|gif|webp|svg|ico)$ - 字体等二进制资源:可一并加入,如
\.(woff2|ttf|eot)$ - 确保该
location块放在server内、且优先级高于通用规则(如location /)
为带哈希资源设长期缓存并启用 immutable
只有 URL 随内容变化(比如构建生成的 main.f9a2b3.js),才能放心设长期缓存。此时配置要同时满足三项:
-
expires 1y或expires max:生成Expires头和基础max-age -
add_header Cache-Control "public, immutable, max-age=31536000":显式声明不可变性,让 Chrome/Firefox 跳过协商请求 - 不加
etag on或if_modified_since on:强缓存下这些验证头无意义,反而可能干扰 CDN
HTML 和无哈希资源必须区别对待
缓存策略失效,往往就坏在这一步:
- HTML 文件(
.html、.htm)必须禁用强缓存:location ~* \.(html|htm)$ { expires -1; add_header Cache-Control "no-cache, must-revalidate, max-age=0"; } - 未做哈希的图片(如
/images/logo.png)不宜设 1 年,建议expires 1d或更短 - favicon.ico、robots.txt 这类手动维护的通用静态文件,设
expires 7d更稳妥
配置后务必验证是否真实生效
改完配置不验证,等于没配:
- 先运行
nginx -t检查语法,再nginx -s reload重载 - 用
curl -I https://your.site/app.a1b2c3.js查看响应头,确认同时存在Expires和Cache-Control: public, immutable - 浏览器打开 Network 面板,刷新页面,找对应资源:状态码显示 200 (from memory cache) 或 200 (from disk cache) 才算成功;若仍是 304,说明
immutable未起效或资源不满足条件











