nginx静态资源强缓存需按文件稳定性分级配置:带哈希的js/css等设expires 1y+cache-control immutable;favicon等设7d;html禁用强缓存(expires -1);须验证响应头、重启nginx并确认浏览器缓存状态。

在 Nginx 中配置静态资源的长期强缓存,核心不是“设得越长越好”,而是让稳定不变的资源(如带哈希指纹的 JS/CSS/字体/图片)真正实现“一次加载、长期复用”,同时避免 HTML 等动态内容被错误缓存。关键靠 expires 指令 + 差异化策略 + immutable 增强。
按文件稳定性分级设置 expires 时间
不同资源更新频率差异大,统一设 1 年会出问题。应结合构建产物特征分层处理:
-
带内容哈希的资源(如
app.7f3a2b.js、style.e8d1c4.css、icon.f9a2b3.svg):路径本身随内容变化,可放心设为长期缓存。
配置示例:location ~* \.(js|css|woff2?|svg|png|jpg|gif|webp)$ {<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>} -
无哈希的通用静态文件(如
favicon.ico、robots.txt、manifest.json):内容可能手动更新,设 1–7 天更稳妥。
配置示例:location = /favicon.ico { expires 7d; } -
HTML 入口文件:必须禁用强缓存,否则版本更新无法生效。
配置示例:location ~* \.(html|htm)$ {<br> expires -1;<br> add_header Cache-Control "no-cache, must-revalidate, max-age=0";<br>}
启用 immutable 提升缓存效率
Cache-Control: immutable 是现代浏览器支持的关键优化。它告诉浏览器:“这个 URL 对应的内容永不会变”,从而跳过后续的 If-Modified-Since 或 If-None-Match 协商请求,彻底省掉一次 HTTP 往返。
- 仅适用于带哈希或版本号的资源(URL 变则内容变)
- 需搭配
expires 1y使用才有效;单独加immutable无意义 - 注意:Safari 直到较新版本才完全支持,Chrome/Firefox 支持良好
验证与生效要点
配置后必须验证响应头是否正确输出,不能只看配置写了没写:
- 用
curl -I https://yoursite.com/app.a1b2c3.js检查是否含Cache-Control: public, immutable, max-age=31536000和Expires头 - 重启或重载 Nginx:
nginx -t && nginx -s reload - 浏览器开发者工具 → Network 标签页 → 查看资源状态码:200 (from memory cache) 或 200 (from disk cache) 表示强缓存生效;304 表示协商缓存,说明
immutable未生效或资源不匹配 - 确保静态文件真实存在于磁盘且有可读权限,否则 Nginx 不会添加缓存头
HTTPS 环境下的协同优化
强缓存在 HTTPS 下收益更大,但需配合连接层优化才能放大效果:
- 开启 TLS 会话复用:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 启用 HTTP/2:
listen 443 ssl http2;,支持多路复用,一次连接并发加载多个缓存资源 - 延长 keepalive:
keepalive_timeout 30s;,提升连接复用率,尤其对打包后少量大资源更有效











