静态资源长效缓存需“路径唯一+响应头精准+类型分治”:js/css等用哈希文件名,nginx按后缀分设expires与cache-control,html禁用强缓存,location匹配要准确,配置后须验证响应头。

为静态资源设置长效缓存过期时间,核心是让浏览器在较长时间内复用本地副本,同时确保内容更新时用户能立即获取新版本。这不靠“设得越长越好”,而靠“路径唯一 + 响应头精准 + 类型分治”三者配合。
用带哈希的文件名作为长效缓存的前提
JS、CSS、字体等资源必须在构建阶段生成含内容哈希的文件名(如main.a1b2c3.js、style.f4d5e6.css)。这样即使内容变了,URL 也变,浏览器自然跳过旧缓存。若仍用app.js这种固定名,哪怕加了expires 1y,用户也收不到更新。
在 Nginx 中按后缀分类配置 expires 和 Cache-Control
把不同稳定性、更新频率的资源分开处理,避免“一刀切”:
- 带哈希的 JS/CSS/字体/WebP/SVG:设 expires 1y,并加 Cache-Control "public, immutable"
- 图片(jpg/png/gif/webp):设 expires 30d,配 Cache-Control "public, max-age=2592000"(兼顾运营灵活调整)
- HTML/PHP/XML 等动态入口页:必须禁用强缓存,用 expires -1 或 expires epoch,并设 Cache-Control "no-cache, must-revalidate, max-age=0"
location 块写法要准确、不重叠
匹配规则必须落在真正服务静态文件的 location 中,且优先级合理:
- 推荐用 location ~* \.(js|css|woff2?|ttf|eot|svg|webp)$ —— 忽略大小写,覆盖主流后缀
- 避免写成 location / { expires 1h; },否则 API 和登录页也会被缓存
- 确保该 location 内有 root 或 alias,让 Nginx 能定位到真实文件,否则 404 导致缓存指令不生效
配置后必须验证响应头是否真实生效
改完不能直接上线,要逐层确认:
- 执行 nginx -t 检查语法,再 nginx -s reload
- 用 curl -I https://yoursite.com/app.a1b2c3.js 查看返回头,确认同时存在 Cache-Control 和 Expires,值符合预期
- 打开 Chrome DevTools → Network → 刷新页面,找一个 JS 文件,看 Size 列是否显示 from memory cache 或 from disk cache











