有没有一种<meta>标签可以在所有浏览器中关闭缓存?

492

我了解到,当您无法访问Web服务器的标头时,可以使用以下方法关闭缓存:

<meta http-equiv="Cache-Control" content="no-store" />

但我也看到在某些版本的IE中这个方法不起作用。有没有一组<meta>标签可以在所有浏览器中关闭缓存?


1
结合Bobince和DPB的答案是你最好的选择,能涵盖所有情况。 - nickf
2
在这个网站上,建议禁用HTTP缓存,以便不将网站存储在中间服务器上。希望这能帮到某些人。 - Bodo
对于像我一样遇到后退按钮和“重新打开关闭的选项卡”缓存问题的人,请查看另一个问题中的此答案。这很繁琐,但是对于我来说,没有基于头文件的解决方案可行,而且对于我的目的,这个小JS片段非常好(易于转换为普通JS)。 - user993683
1
这里的答案都很令人沮丧。我本想添加自己的答案,但是此问题已关闭。根据 MDN:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control,您实际上最有可能使用 <meta http-equiv="Cache-Control" content="no-store"/>,就像问题中所述。 - Andrew
1
然后我会为您添加标签。 - Rob
显示剩余4条评论
6个回答

750

对于现代网络浏览器(IE9及以上版本)

查看页面顶部的“重复”部分以获取正确信息!

在这里查看答案:如何控制所有浏览器中的网页缓存?


对于IE9及其之前版本

不要盲目地复制粘贴!

该列表仅用于展示不同技术的示例,而不能直接插入到您的代码中。如果直接复制,第二个http-equiv声明会覆盖第一个,第四个会覆盖第三个,并且由于http-equiv声明,代码将无法通过W3C验证。当使用现代的最新浏览器(至少是IE9之后),这些声明已经完全过时了。Chrome和Firefox特别针对这些声明不像您期望的那样或者根本就不会生效。

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

实际上完全不要使用这些!

在元素中缓存头是不可靠的,因为任何位于站点和用户之间的网络代理都将完全忽略它们。对于类似Cache-Control和Pragma的头,请始终使用真正的HTTP头。


244
更多的解释会更好。为什么要重复使用缓存控制和过期时间?你需要所有这些吗?1980年有什么特别之处?pragma:no-cache和cache-control:no-cache之间有什么区别?更多的解释会更好。 - Bennett McElwee
18
不确定百分之百,但我认为这些重复是为了处理不同的浏览器。 - Andrew Hagner
11
我找到的最接近解释的链接是:http://www.i18nguy.com/markup/metatags.html。 - Andrew Hagner
34
有时为了让网页在所有浏览器上正常运行,我们需要违反某些验证规则。 - Axel Advento
29
这个列表只是不同技术的例子,不能直接插入使用。如果复制了,第二个会覆盖第一个,第四个会覆盖第三个,因为有http-equiv声明,并且在通过W3C验证时会失败。最多只能有每个http-equiv声明中的一个;pragma、cache-control和expires。 - StrangeDucks
显示剩余15条评论

84

5
我发现使用Cache-Control: no-cache时,Chrome表现更佳(之后100%为条件请求)。然而,“no-store”有时会在没有尝试条件请求的情况下仍从缓存中加载。Firefox对“no-store”的响应更好,但如果立即重新加载,则有时仍会从缓存中加载。真是一团糟! - ianbeks

25

它在IE5中不起作用,但这并不是一个大问题。

然而,在元素中缓存头是不可靠的;首先,站点和用户之间的任何Web代理都将完全忽略它们。您应始终为诸如Cache-Control和Pragma之类的头使用真正的HTTP头。


@bobince,谢谢!如果我在使用Web代理时遇到任何问题,我会记住这个方法,但是我的“团队”完全让我专注于前端,并且不允许我访问标头。 - leeand00
6
即使这是在2009年写的,提到IE5的兼容性已经不相关了。 - Alex White
25
在IE2中也不起作用,哈哈。 - Shawn Dotey

9

pragma是您的最佳选择:

<meta http-equiv="Pragma" content="no-cache">

9
这是旧的,因此您的建议是因为在较新的实现中,这通常会被解释为缓存头缓存控制:无缓存。因此,实际上最好使用更现代的<meta http-equiv="cache-control" content="no-cache" />。 - Chris Halcrow

8

我注意到在重复服务调用(长轮询)时存在缓存问题。添加元数据没有帮助。一种解决方案是传递一个时间戳来确保ie认为这是不同的http服务请求。这对我有用,因此添加一个服务器端脚本代码片段以自动更新此标记是没有坏处的:

<meta http-equiv="expires" content="timestamp">


这真的很聪明,它也可以在Chrome上工作。 - Geomorillo

-5

尝试使用

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Expires" CONTENT="-1">

10
为什么要尝试它?你能解释一下吗? - user4227915
一些解释会很好... - Alejandro González
它在Chrome上不起作用。 - Donald Duck
你应该先在 W3C 验证器中尝试你的解决方案(并查看错误)。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接