单页应用入口index.html必须禁用缓存以防白屏:使用location = /index.html精确匹配并设置no-cache/no-store/must-revalidate三重头;静态资源则通过内容哈希+immutable实现强缓存。

单页应用的入口文件 index.html 必须禁止浏览器缓存,否则用户可能加载旧版 HTML,进而请求过期的 JS/CSS 文件,导致白屏、报错或功能异常。这不是“清不清缓存”的问题,而是缓存策略本身设计不当。
精准匹配并强制禁用 index.html 缓存
不能依赖全局 expires 或基于 MIME 类型的 map 判断,因为 try_files 内部重写时,$sent_http_content_type 可能为空,导致缓存头误设为一年。
- 使用
location = /index.html精确匹配所有对入口文件的直接请求(包括软刷新触发的内部重定向) - 在此块中显式设置三重保险头:
add_header Cache-Control "no-cache, no-store, must-revalidate";add_header Pragma "no-cache";add_header Expires "0"; - 搭配
try_files /index.html =404;,确保路径存在且返回正确状态码
静态资源走强缓存 + 内容哈希
JS、CSS、字体、图片等必须做到“内容变 → URL 变”,才能安全启用长期缓存。
- 构建工具(Vite/webpack)开启 contenthash,生成如
app.a1b2c3.js这类带哈希的文件名 - Nginx 中用正则 location 提前拦截这些后缀:
location ~* \.(js|css|png|jpg|woff2|ttf|eot|svg)$ {expires 1y;add_header Cache-Control "public, immutable";} -
immutable告诉浏览器:只要 URL 不变,内容就永不变化——配合哈希,彻底规避版本错配
避免反向代理和中间层干扰
即使前端和 Nginx 配置都正确,CDN、负载均衡器或 Nginx 自身的 proxy_cache 仍可能悄悄缓存 index.html 并返回错误 MIME 类型。
立即学习“前端免费学习笔记(深入)”;
- 确认未启用
proxy_cache或已为其排除/index.html路径 - 检查响应头中
Content-Type是否始终为text/html,避免因类型误判被缓存为二进制流 - 若使用 CDN,需单独配置
/index.html的缓存策略为“不缓存”或“仅回源校验”
验证是否生效
不要只看页面是否能打开,要验证底层行为:
- 执行
curl -I https://your-domain.com/index.html,确认响应头含Cache-Control: no-cache, no-store...且无max-age - 访问一个不存在的前端路由,如
/random-path,应返回 200 +Content-Type: text/html,且响应体是index.html内容 - 在浏览器 Network 面板中刷新页面,观察
index.html请求是否带If-None-Match头,并收到 304(说明协商缓存正常工作)


















