Expires: Thu, 01 Jan 1970 00:00:00 GMT、Pragma: no-cache、Cache-Control: no-cache, no-store, must-revalidate 和 Last-Modified 组合使用,才能在 IE6–IE8 等旧浏览器中彻底杜绝缓存,单用任一字段均不充分。

直接用 Expires: 0 和 Pragma: no-cache 确实能覆盖 IE6–IE8、Netscape 4 等上古浏览器,但单独用它们并不“彻底杜绝缓存”——必须组合使用、正确放置,并配合其他头字段才能真正生效。
关键不是“加了就行”,而是让旧浏览器按 HTTP/1.0 规范严格执行不缓存逻辑。以下是实操要点:
Expires: 0 必须是过去时间,且格式严格
旧版 IE(尤其 IE6)对 Expires 解析极脆弱,只认 RFC 822 格式(GMT 时区 + 完整星期+日期+时间),且要求时间值明确早于当前时间。
- ✅ 正确写法(服务器端响应头):
Expires: Thu, 01 Jan 1970 00:00:00 GMT
- ❌ 错误写法(会被忽略或误判):
Expires: 0(非标准格式,IE6 不识别)、Expires: -1(部分代理拒绝解析)、Expires: 00:00:00(缺时区和日期)
Pragma: no-cache 是 HTTP/1.0 的兜底指令,但仅作用于请求链路
它本身不阻止浏览器缓存响应,而是告诉中间代理(如公司网关)“别用缓存返回,必须转发请求”。要让它影响最终浏览器行为,需配合:
-
Cache-Control: no-cache(HTTP/1.1,现代浏览器主控) -
Last-Modified或ETag(让浏览器在每次请求时强制校验,而非跳过)
否则,IE6 可能仍从本地缓存读取资源(尤其对 GET 静态资源),仅不走代理缓存。
兼容旧浏览器的完整响应头组合
以下头字段需全部由后端输出(前端 meta 标签在 IE6 中支持不全,不可靠):
Expires: Thu, 01 Jan 1970 00:00:00 GMT Pragma: no-cache Cache-Control: no-cache, no-store, must-revalidate Last-Modified: <当前响应生成时间,RFC 1123 格式>
说明:
-
no-store阻止任何环节(浏览器、代理、硬盘)存储副本,比no-cache更强硬; -
must-revalidate强制每次验证,避免“启发式缓存”(IE6 对无Expires且无Cache-Control的响应会自行估算缓存时长); -
Last-Modified提供校验依据,否则no-cache在旧浏览器中可能退化为“不检查直接用缓存”。
额外加固:避免被 URL 缓存绕过
旧浏览器(如 IE6)对带查询参数的 URL 也常缓存。若前端通过 JS 动态加载资源(如 script.src = "a.js"),需手动添加时间戳或随机参数:
const ts = new Date().getTime();
script.src = `data.js?t=${ts}`;单纯加 ?v=1.0 不够——版本号不变时仍会复用缓存,必须每次不同。
基本上就这些。


















