能,HTML应禁用强缓存、每次协商验证,而带哈希的JS/CSS/图片等静态资源需配Cache-Control: public, immutable与1年有效期,确保浏览器跳过验证直接复用。

核心是让带哈希的文件走强缓存,同时确保 HTML 永远拉新——浏览器看到新文件名就自然弃用旧缓存,根本不用“更新”它。
静态资源(JS/CSS/图片)配长缓存 + immutable
匹配所有带哈希后缀的常见静态资源,设置一年有效期并声明不可变:
- 在 location 块中添加正则匹配:
location ~* \.(js|css|png|jpg|jpeg|gif|webp|woff2|ttf|eot|svg)$ { - 启用强缓存:
expires 1y; - 明确告知浏览器该资源内容不会变:
add_header Cache-Control "public, immutable";
这样浏览器首次加载后,后续访问直接从内存读取,跳过网络请求,既快又准。注意:immutable 是关键,它阻止了无谓的 304 验证。
HTML 文件必须禁用强缓存
index.html 是入口,它不更新,里面引用的新哈希路径就永远进不来。不能靠 max-age,必须每次校验:
- 单独匹配 HTML:
location ~* \.html$ { - 设为协商缓存:
add_header Cache-Control "no-cache"; - 确保 ETag 和 Last-Modified 生效:
etag on;和if_modified_since exact;
浏览器每次请求都会带 If-None-Match,Nginx 校验后返回 304(未变)或 200(新 HTML),既保及时性又省流量。
验证是否真正生效
别只信配置,要查真实响应头:
- 打开 Chrome DevTools → Network → 刷新页面
- 点一个
app.a1b2c3.js:检查 Response Headers 中是否有Cache-Control: public, immutable和Expires是一年后 - 点
index.html:确认Cache-Control是no-cache,且第二次加载状态码为304 - 命令行快速核对:
curl -I https://yoursite.com/app.xxx.js
避开常见陷阱
很多问题其实出在配置覆盖或 CDN 层:
- 确保 HTML 的 location 规则没有被更宽泛的规则(比如
location /)提前截断 - CDN 缓存策略需同步:把
.html设为不缓存,其余静态资源按扩展名设长缓存 - 不要对 JS/CSS 用
no-cache或max-age=0:这会让每次请求都走完整 HTTP 流程,反而更慢 - SPA 应用记得加回退路由:
try_files $uri $uri/ /index.html;,但要放在静态资源 location 之后,避免干扰哈希资源的缓存
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











