HTML缓存配错反致用户卡在旧页面,真正提速靠HTML及时更新+静态资源强缓存;index.html应设no-cache或max-age=0,must-revalidate,JS/CSS等须带内容哈希并配immutable。

Cache-Control 响应头配错,HTML 缓存反而会让用户卡在旧页面里——这不是提速,是埋雷。真正起效的不是“缓存 HTML”,而是让 HTML 及时更新、让 JS/CSS/图片稳稳走强缓存。
为什么给 index.html 设 max-age=3600 是高危操作
HTML 文件通常含动态内容:用户昵称、未读数、CSRF token、实时时间戳。哪怕只改了一个按钮文案,旧缓存就会导致功能异常。
- 登录后仍显示“请登录”按钮
- 商品价格没变,但下单时发现已涨价
- 表单提交失败,因为隐藏字段里的
csrf_token已失效
根本原因是 max-age 触发强缓存,跳过服务器验证;而 HTML 很少配 ETag 或 Last-Modified 做兜底,浏览器就真的一小时都不问服务器了。
index.html 该用 no-cache 还是 max-age=0, must-revalidate
两者效果接近,但行为细节不同:
立即学习“前端免费学习笔记(深入)”;
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
Cache-Control: no-cache表示“可缓存,但每次必须验证”——浏览器会带If-None-Match或If-Modified-Since发请求,服务端返回304 Not Modified就复用本地副本 -
Cache-Control: max-age=0, must-revalidate更明确强制每次走协商流程,兼容性略好 - 别用
private:CDN 节点会忽略它,若你依赖 CDN 加速,资源就无法被边缘缓存
真实生效方式只有两种:Nginx 配置 add_header Cache-Control "no-cache",或后端代码(如 Express)调用 res.set('Cache-Control', 'no-cache')。
静态资源怎么配才真正减少请求
提速的关键不在 HTML,而在它引用的 main.js、style.css、logo.png——这些文件体积大、变动少,适合激进缓存:
- 必须用构建工具生成带内容哈希的文件名,例如
main.a1b2c3.js,内容一变 URL 就变,浏览器自然弃旧取新 -
Nginx配置示例:location ~* \.(css|js|woff2|png|jpg|gif)$ { expires 1y; add_header Cache-Control "public, immutable"; } -
immutable指令很重要:它告诉浏览器“这个 URL 永远不会变内容”,后续访问可跳过If-None-Match验证请求,省掉一次往返
如果不用哈希命名,immutable 反而危险——改了文件内容但 URL 不变,用户就永远拿不到新版本。
CDN 缓存和源站响应头不一致是最常被忽略的断点
你 Nginx 设了 no-cache,但 CDN 后台默认开启 HTML 缓存(比如缓存 10 分钟),结果用户提交表单后刷新看到的还是旧页。
- 检查 DevTools 的 Network 面板,看
index.html的响应头中Cache-Control是否生效 - 再看
x-cache(Cloudflare)或x-cdn-cache(阿里云)头确认是否命中 CDN - CDN 缓存策略必须按路径精细控制,例如
/static/**缓存 1 年,/index.html缓存 60 秒——且必须和服务端响应头一致
最易被忽略的点是:HTML 缓存时间越长,对 JS/CSS 路径哈希的依赖就越强;一旦构建产物没打哈希,或 CDN 覆盖了源站头,整个缓存链就失效了。


















