本质是html被强缓存导致无法获取新版本,需禁用其强缓存、启用协商缓存(no-cache+etag),同时确保js/css带hash并配immutable长缓存,且排除cdn干扰。

全站开启强缓存后页面不更新,本质是 HTML 文件被浏览器长期缓存,而它引用的 JS/CSS 文件虽带 hash 但 HTML 本身没变,用户永远拿不到新 index.html —— 所以问题不在“有没有版本指纹”,而在“HTML 该不该缓存”。
确认 HTML 是否被强缓存
打开浏览器开发者工具 → Network 标签 → 刷新页面 → 找到 index.html(或根路径 /)请求:
- 看响应头里是否有
Cache-Control: max-age=...或Expires;若有且值很大(如 31536000),说明 HTML 被强缓存了 - 状态码是
200 OK (from memory cache)或200 OK (from disk cache),而非真实服务器返回,就坐实了问题 - 对比本地 curl 请求:
curl -I https://your-domain.com/,看响应头是否一致 —— 排除 CDN 缓存干扰
修正 Nginx 对 HTML 的缓存策略
HTML 必须禁用强缓存,只保留协商缓存。在 server 或 location 块中明确配置:
- 移除所有对
/或/*.html的expires或add_header Cache-Control ...强缓存指令 - 添加标准协商缓存支持:
add_header Cache-Control "no-cache";
etag on;
if_modified_since exact;
}
这样每次请求都会发 If-None-Match 或 If-Modified-Since,Nginx 校验后返回 304(未变)或 200(新内容),既保证实时性又节省带宽。
检查静态资源路径与构建产物一致性
即使 HTML 不缓存,若构建后 JS/CSS 文件名没变(比如没加 hash),浏览器仍会复用旧缓存:
- 确认打包工具(Webpack/Vite/Rollup)已启用 contenthash 或 fullhash,生成类似
main.a1b2c3.js的文件名 - 检查 Nginx 中静态资源 location(如
/static/、/assets/)是否配置了长期缓存:
expires 1y;
add_header Cache-Control "public, immutable";
}
注意:immutable 是关键,它告诉浏览器“这个文件名永不变,可放心长期缓存”——前提是文件名真带 hash。
排查 CDN 层级缓存干扰
如果用了 CDN(Cloudflare/阿里云/腾讯云),它可能把 HTML 也缓存了,且刷新不及时:
- 在 CDN 控制台查看 HTML 路径(如
/*或/index.html)的缓存规则,确保设置为“绕过缓存”或“缓存 TTL=0” - 临时关闭 CDN 回源测试:直接访问源站 IP 或 Host 头直连 Nginx,确认问题是否消失
- 发布后主动触发 CDN 缓存刷新(不是预热),尤其注意通配符路径和 query 参数是否被忽略











