html不应长期缓存,因其动态性易致内容错误;应设no-cache或max-age=0;静态资源则需文件哈希+immutable+1年缓存,并统一cdn与源站配置。

能,但只对特定资源有效——HTML 文件本身缓存收益低、风险高,盲目设 max-age 反而导致用户看到过期页面;真正该长期缓存的是 css、js、img 这类静态资源,并配合文件哈希和 immutable 指令。
为什么 HTML 不适合设 long-term cache
HTML 通常是动态生成的(比如带用户信息、实时数据、CSRF token),哪怕只改一行内容,浏览器若还用着 1 小时前的缓存,就会显示错误状态或旧数据。这不是“加载变慢”,而是“加载了错的内容”。常见现象包括:
- 用户登录后仍显示“请登录”按钮
- 商品价格没更新,下单时才发现已涨价
- 表单提交失败,因为隐藏字段里的
csrf_token已失效
所以服务端返回 HTML 时,应优先用 Cache-Control: no-cache 或 max-age=0, must-revalidate,让浏览器每次发起条件请求(带 If-None-Match 或 If-Modified-Since),由服务器决定是否返回 304 Not Modified。
静态资源怎么配才真正提速
对 css、js、font、png 等不常变更的资源,缓存策略要激进些——目标是“一次下载,长期复用”。关键有三点:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 用构建工具在文件名里嵌入内容哈希,例如
main.a1b2c3d4.js,这样内容一变,URL 就变,彻底绕过缓存问题 - 响应头设
Cache-Control: public, max-age=31536000, immutable(1 年 + 不可变);immutable告诉浏览器:这个 URL 永远不会变内容,别发条件请求了 - Nginx 配置示例:
location ~* \.(css|js|woff2|png|jpg|gif)$ {<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>}
CDN 缓存和源站响应头必须一致
很多团队只在 Nginx 配了 Cache-Control,却忘了 CDN(比如 Cloudflare、阿里云 CDN)有自己的缓存规则,它可能无视源站头、或按自己默认策略缓存 HTML。结果就是:
- 你改了 HTML,源站已返回新内容,但 CDN 还在吐旧版
- 你在源站加了
no-cache,CDN 却按“HTML 默认缓存 10 分钟”来执行
解决方法很简单:登录 CDN 控制台,找到对应路径的缓存规则,显式设置为 “遵循源站响应头” 或手动覆盖为 Cache-Control: no-cache(HTML 路径)和 Cache-Control: public, immutable(带哈希的静态资源路径)。
协商缓存不是万能的,Etag 有开销
当 HTML 设了 no-cache,浏览器每次都会发请求,服务器需计算 Etag 或比对 Last-Modified。如果 HTML 是模板渲染生成的(如 Django、Express),每次都要走完整渲染流程只为返回一个 304,反而增加 TTFB。更轻量的做法是:
- 对纯静态 HTML(如
/about.html),用Last-Modified基于文件修改时间,开销极小 - 对动态 HTML,直接禁用协商缓存:返回
Cache-Control: no-store,强制不缓存(适合含敏感信息的页面) - 用
Vary: Cookie或Vary: Authorization时务必谨慎——它会让缓存碎片化,CDN 可能为每个用户存一份副本,失去共享优势
最常被忽略的一点:HTML 缓存的价值不在“省一次请求”,而在于避免因缓存错配引发的业务逻辑错误。速度只是副产品,正确性才是前提。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










