HTML不能加contenthash改名,因其是入口调度器,必须用no-cache+ETag协商缓存;JS/CSS等静态资源才需contenthash+immutable强缓存。

HTML 本身不能加 contenthash 后缀
强行给 index.html 改名成 index.a1b2c3.html 是无效操作,不是配置不到位,而是架构错位。浏览器永远请求固定路径 /index.html,一旦改名,所有相对路径(如 ./js/app.js)立刻失效;SEO 会断链;PWA 的 manifest.json 和 service-worker.js 中 precache 列表全崩;CDN 回源、Nginx 路由、HTML 内硬编码的 src 都得同步改——维护成本指数级上升。
更根本的问题是:HTML 是入口调度器,不是静态资源。它唯一作用是告诉浏览器“接下来该加载哪些 JS/CSS”。如果用户卡在旧版 index.html,哪怕你已部署 app.d41d8c.js,他也永远看不到这个 URL,缓存链从第一环就断了。
HTML 必须用 no-cache + ETag 协商缓存
正确做法是让服务端对所有 .html 响应返回协商缓存头,既避免强缓存导致页面陈旧,又不重复传输整个文件体。
-
Cache-Control: no-cache, must-revalidate不等于“不缓存”,而是强制每次发起条件请求(带If-None-Match) -
ETag必须由服务端基于文件内容生成(推荐md5或crc32),比Last-Modified更可靠——HTML 可能只改了<title>或内联脚本,内容没变时 ETag 不变,返回304 Not Modified - 不要依赖
<meta http-equiv="Cache-Control">:现代浏览器完全忽略它,中间代理和 CDN 也基本不认 - 验证方式:DevTools → Network → 刷新 → 看
index.html请求的 Response Headers 是否含ETag,Status 是否出现304
JS/CSS 等静态资源必须带 contenthash + immutable
真正需要指纹控制的是被 HTML 引用的静态资源:JS、CSS、字体、SVG、WebP 图片等。它们内容稳定、体积大、复用率高,适合构建时生成内容哈希,并配强缓存策略。
立即学习“前端免费学习笔记(深入)”;
- Webpack 示例:
output.filename: "[name].[contenthash:8].js";Vite 默认启用build.rollupOptions.output.entryFileNames带 hash - Nginx 配置示例:
location ~* \.(js|css|woff2|png|jpg|gif)$ { expires 1y; add_header Cache-Control "public, immutable"; } -
immutable很关键:它告诉浏览器“这个 URL 永远不会变内容”,后续访问跳过If-None-Match校验,省一次网络往返;漏配会导致即使 URL 带哈希,浏览器仍可能复用旧缓存 - CDN 缓存策略必须与源站一致:不能只在 Nginx 配了
immutable,却让 Cloudflare 按默认 4 小时缓存——要进 CDN 控制台,显式设置“遵循源站响应头”或手动覆盖路径规则
CDN 加速只作用于静态资源,不是 HTML 文件本身
HTML 文件本身不走 CDN 加速,真正加速的是它 <script>、<link>、<img> 标签里引用的 JS/CSS/图片等资源。只要这些标签的 src 或 href 指向 CDN 域名(如 https://static.example.com/js/app.abc123.js),就生效了。
- 确认是否生效:打开 DevTools → Network → 刷新 → 点一个 JS 请求 → 看 Request URL 是否为 CDN 地址;若仍是
https://example.com/js/app.js,说明没接入成功 - 别手动改每个
src:Webpack 用publicPath,Vite 用base配置自动拼接 CDN 前缀;否则容易漏、难维护 - 注意相对路径陷阱:
./logo.png不该加前缀,而/img/icon.svg才该换;纯 HTML 写死的<img src="logo.png">Vite 不处理,得靠构建后脚本批量替换 - 务必验证构建产物中
entryFileNames和assetFileNames是否含哈希——否则 CDN 缓存更新会出问题
最容易被忽略的点是:ETag 必须由服务端真实计算并注入,不能靠 Nginx 的 etag on; 对 HTML 文件直接启用——它只对磁盘文件生效,而很多项目 HTML 是模板渲染或 SSR 生成的,内容动态变化但文件时间戳不变,ETag 就会失效。这时候必须在应用层生成内容哈希并写入响应头。



















