<meta http-equiv="Cache-Control" content="no-store">在现代浏览器中基本失效,唯一有效方式是服务端精确配置location = /index.html并返回Cache-Control: no-store等响应头。

单独写 <meta http-equiv="Cache-Control" content="no-store"> 是当前唯一还有一点作用的写法,但必须清楚:它只在极少数场景下“看起来有效”,绝大多数情况下根本拦不住缓存——浏览器压根不认。
为什么 <meta http-equiv="Cache-Control"> 基本失效
现代浏览器(Chrome 124+、Firefox 125+、Safari 17+、Edge 125+)收到任何服务端 Cache-Control 响应头后,会直接跳过解析 <meta http-equiv>。即使你写了十行,Network 面板里也看不到对应响应头,状态码还是 200 from memory cache 或 304。
- 它只对“直接在地址栏输入回车”或“F5 刷新”这类首次加载有微弱影响,且仅限旧版 IE/Android Browser
- 跳转页(
window.location.href = "page.html")、后退按钮(bfcache)、JS 动态加载的 HTML 片段,完全不受控制 -
<meta http-equiv="Pragma">在所有主流浏览器中被彻底忽略,W3C 规范也没要求支持,写了等于白写 -
<meta http-equiv="Expires">对 IE6–8 有点用,但现代浏览器只当注释看
Nginx 配置 location = /index.html 才是真解法
如果你能改服务器,这是唯一靠谱路径。重点不是“怎么写 meta”,而是“怎么让服务端返回正确的响应头”。
- 必须用精确匹配:
location = /index.html,不能写成location /index.html或location ~* \.html$,否则会污染其他 HTML 文件 - 响应头要写全:
add_header Cache-Control "no-store";+add_header Pragma "no-cache";+add_header Expires "0"; -
no-store比no-cache更彻底:前者禁止存任何副本,后者仍缓存但每次校验——SPA 场景下极易白屏 - 检查有没有全局
expires 1h指令,它会覆盖add_header,必须删掉或移出server块顶部
开发阶段验证是否生效的硬核方法
别信 F5,别信“清了缓存”,要用 DevTools 看真实响应头和状态码。
立即学习“前端免费学习笔记(深入)”;
- 打开 DevTools → Network 面板 → 勾选
Disable cache(这只影响当前调试会话,不能代替真实配置) - 手动清缓存:Chrome 设置 → 隐私和安全 → 清除浏览数据 → 勾选“缓存的图片和文件”
- 点击
index.html请求 → Headers → Response Headers → 确认出现Cache-Control: no-store - 状态码必须是
200(不是200 from memory cache),否则说明缓存还在生效 - 用
Ctrl+Shift+R硬刷新或新开无痕窗口测试,普通 F5 容易误判
真正起作用的只有两件事:服务端返回的 Cache-Control 响应头,以及 JS/CSS 文件名里的哈希(由构建工具自动生成)。<meta> 标签现在只剩一个价值:给人工排查版本时加个时间戳注释,比如 <meta name="build-time" content="2026-08-12T20:45:00Z"> —— 浏览器完全不读它,但它能帮你快速确认部署的是不是最新包。



















