如何防止Firefox中的前向缓存显示内容?

如何防止Firefox中的前向缓存显示内容?,firefox,cache-control,browser-cache,Firefox,Cache Control,Browser Cache,浏览器:Firefox 6.0 我使用以下设置创建了一个页面,以确保内容未存储在浏览器的中: 1) $(窗口).unload(函数(){}) 2) 以下HTTP标头: <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="expires" content="-1" /> <meta http-equiv="cache-control" content="no-cache"/>

浏览器:Firefox 6.0

我使用以下设置创建了一个页面,以确保内容未存储在浏览器的中:

1)
$(窗口).unload(函数(){})

2) 以下HTTP标头:

<meta http-equiv="pragma" content="no-cache" /> 
<meta http-equiv="expires" content="-1" />
<meta http-equiv="cache-control" content="no-cache"/>

我还连接了事件
pagehide
pageshow
。当我离开页面时,
pagehide
被调用,事件属性的值正确
persisted=false
(这就是需要的:缓存中没有持久性!)

浏览了几页之后,我有了一个
窗口.history.go(-2)
返回A页。此时,我希望Firefox轮询服务器以获取更新版本,而不是从缓存中显示。使用事件属性的正确值调用页面A的
pageshow
(表示页面未从缓存加载)。但页面内容不是服务器数据;这是过时的内容(与最初离开页面时相同)!Fiddler也不会向服务器显示新请求

谷歌浏览器也表现出同样的行为。IE按预期工作(重新加载新数据)

你知道我错过了什么吗


提前谢谢

涉及多个缓存。有浏览器的文档缓存(bCache)、浏览器的HTTP缓存,可能还有中间HTTP缓存

上面显示的
标记在当前的Chrome或Firefox中绝对没有效果。它们可能会对IE产生影响

因此,很可能您的页面只是从浏览器的HTTP缓存中读取的

如果你真的不想发送缓存HTTP头,你应该这样做。但它们必须是实际的HTTP头:正如我上面所说的,
标记“equivalents”什么也不做


而且,重要的是,任何其他中间缓存都不会解析您的HTML,因此如果您没有实际发送正确的HTTP头,可能会缓存内容。

下面的答案不再有效:

从中,将
unload
事件添加到窗口会导致清除后向/前向缓存

更新。可能的解决方案:

BFCache可以给开发者带来惊喜,因为至少在Firefox中,当向后/向前移动页面时,即使HTTP头告诉页面,页面也不会刷新。因此,最好假设页面不会刷新

另一方面,由于BFCache而获取包含过时数据的页面与在浏览器中找到一个很久没有重新加载的选项卡之间有什么区别


如果您关心这类事情,请编写一些javascript来检查服务器的更新并重新加载敏感信息。这是一个将问题转化为胜利的机会。)

如果将
缓存控制:“无缓存,无存储,必须重新验证”
设置为http头,则页面不会缓存在前向缓存中


Firefox还将卸载前
事件上的事件处理程序视为不在BFC中存储页面的信号,但Safari会忽略此类处理程序,因此最好设置正确的http头以指示页面内容的性质(可缓存或可变)

需要记住两个缓存:

bfcache(向后转发缓存) bfcache(在Firefox和Safari中)将页面存储在内存中,包括对DOM的任何动态修改。Firefox和Safari在按back键时使用它。要确保页面未存储在此缓存中,您需要运行以下行:

window.addEventListener('unload', function(){}); // Does nothing but break the bfcache in Firefox and Safari
请注意,Webkit文档将bfcache称为“页面缓存”

普通浏览器缓存 页面缓存在普通浏览器缓存中,除非在
缓存控件
标题中设置了正确的
无存储
值。为确保安全,请发送此完整标题:

Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private

当按下后退按钮时,Firefox和Safari将首先检查bfcache。然后,它们将返回到正常缓存。因此,您需要将事件侦听器添加到
卸载
,并设置此
缓存控制
HTTP头。请注意,使用
而不是HTTP头可能不起作用。

谢谢!以下HTTP头已可用:
缓存控制:无缓存Pragma:无缓存过期:-1
很遗憾,它们也没有帮助。在您回复后,我重新查看了标题,发现Firefox需要另一个标题来防止缓存:
缓存控制:无缓存,无存储
添加上述标题后,它现在在IE、Firefox、Chrome和Safari中正常工作。只有Opera仍然会通过缓存进行错误行为,但我将暂时推迟这个问题。另一个注意事项:如果站点启用SSL,Firefox不会存储在bfcache中!我的生产系统是SSL,而开发系统不是。因此,生产系统在Firefox中工作正常,不需要像上面提到的那样添加任何HTTP头!这取决于您的HTTP头。SSL+无缓存将不会存储在bfcache中,但可缓存SSL将被存储。正确<代码>无缓存
标头在我的案例中已存在。“附加HTTP头”是指
no-store
头;如果使用SSL,这不是必需的!后退/前进缓存===bfcacheI无法通过将
unload
事件添加到类似
window.onunload=function(){console.log('lets unload windows');}
的窗口来使bfcache无效。你能更具体一点怎么做吗?非常感谢。我在上尝试了该示例,结果它也不起作用。我尝试了$(window).unload(function(){});,仍然从bf cache加载页面HTTP头只影响普通缓存,而不影响bfcache(在Firefox中)。为了更加确定,您需要同时设置标题和
unload
事件。按back键时,Firefox将使用bfcache,如果这不起作用,则返回正常缓存,因此您需要确保页面未缓存在bo中