HTML静态化必须使用共享存储(如NFS、MinIO或CDN源站),禁止写本地磁盘;需单点生成、按业务主键命名文件,配合Cache-Control与URL版本参数控制缓存;含用户态内容的页面禁止静态化,应保留动态路由或异步加载;CDN需显式配置响应头透传,且JS/CSS资源哈希与immutable策略比HTML缓存更重要。

HTML静态化必须走共享存储,不能写本地磁盘
多节点部署下,os.path.join(BASE_DIR, 'static_html', 'index.html') 这种路径直接失效——5台机器各自生成,只有1台能提供最新版本,其余返回旧文件或404。
静态文件必须输出到统一位置:NFS、MinIO 或 CDN 源站目录,且更新动作只能由 CI/CD 流水线或独立任务服务单点触发。
- 常见错误是用
datetime.now().strftime拼文件名,导致缓存击穿;正确做法是按业务主键命名(如detail_12345.html) - 配合
Cache-Control: public, max-age=60和 URL 参数?v=202606222020控制 CDN 刷新 - 别把生成逻辑放在请求里——哪怕加了锁,高并发下仍可能重复写、覆盖、竞争失败
含用户态内容的页面禁止静态化
购物车数量、登录态欢迎语、实时评论这类内容一旦被固化进 HTML,就只能靠前端 JS 补丁渲染,反而拖慢首屏、增加调试成本。
强行静态化会引入 ESI 片段组装或后端动态 include,架构复杂度陡增。
立即学习“前端免费学习笔记(深入)”;
- 判断标准很简单:只要页面里有
{{ current_user.name }}、${cartCount}或document.cookie相关逻辑,就别走静态化路径 - 这类页面应保留动态路由,用
try_files $uri @dynamic在 Nginx 层兜底 - 如果非得“伪静态”,至少把用户态部分抽成独立接口,用
fetch()异步加载,避免阻塞 HTML 解析
CDN 缓存和源站响应头不一致怎么办
这是最常被忽略的协同断点:你 Nginx 设了 no-cache,但 CDN 后台默认开启“自动缓存 HTML”,结果用户刷新看到的还是 10 分钟前的首页。
- 必须在 CDN 控制台显式关闭 HTML 自动缓存,或设置匹配规则(如
^/index\.html$)强制透传 - 源站响应头要真实生效:用
curl -I验证返回的Cache-Control,而不是只看 Nginx 配置是否写了 - CDN 缓存 key 默认包含 Host、Accept-Encoding 等字段,若你用了多个子域名或客户端压缩差异大,需确认是否被误判为不同资源
HTML 该用 no-cache 还是 max-age=0
两者效果接近,但语义和协作行为不同:
-
Cache-Control: no-cache表示“可缓存,但每次必须验证”——浏览器会带If-None-Match或If-Modified-Since发请求,服务端返回304 Not Modified就复用本地副本 -
Cache-Control: max-age=0, must-revalidate是更明确的写法,强制每次走协商流程,兼容性略好于纯no-cache - 绝对不要用
<meta http-equiv="Cache-Control" content="">:现代 Chrome/Firefox/Edge 完全忽略它,只在某些老旧 WebView 中降级生效 - 真实生效的方式只有两种:
Nginx配置add_header Cache-Control "no-cache",或后端代码(如 Express)调用res.set('Cache-Control', 'no-cache')
main.a1b2c3.js 加 immutable,比一百个 index.html 设 no-cache 更影响实际加载速度。很多人盯着 HTML 缓存策略调,却忘了 JS/CSS 文件名没哈希、CDN 没配 immutable,这才是首屏卡顿的真正瓶颈。



















