浏览器: Firefox 6.0
我使用以下设置进行了Page A,以确保内容未存储在浏览器的bfcache中:
1)$(window).unload(function(){});
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
的CORRECT值(这是需要的:缓存中没有持久性!)
浏览了几页后,我有一个window.history.go(-2);
返回到页面A.此时,我希望Firefox在服务器上轮询更新版本,而不是从缓存中显示。使用事件属性pageshow
的CORRECT值调用页面A的persisted = false
(意味着页面未从缓存加载)。但页面内容不是服务器数据;它是陈旧的内容(与最初离开页面时相同)! Fiddler也没有向服务器显示新的请求。
Google Chrome也表现出相同的行为。 IE按预期工作(重新加载新数据)!
知道我错过了什么吗?
提前致谢!
答案 0 :(得分:9)
涉及多个缓存。浏览器的文档缓存(bfache),浏览器的HTTP缓存以及可能的中间HTTP缓存。
您在上面显示的<meta>
标记在当前的Chrome或Firefox中完全没有效果。它们可能会在IE中产生影响。
很有可能,您的页面只是从浏览器的HTTP缓存中读取。
如果你真的想发送no-cache HTTP标头,你应该这样做。但它们需要是实际的HTTP标头:正如我上面所说,<meta>
标签“等价物”什么都不做。
而且,重要的是,任何其他中间缓存都不会解析您的HTML,因此如果您实际上没有发送正确的HTTP标头,则可能会缓存内容。
答案 1 :(得分:2)
以下答案不再适用:
从answer on SO开始,向窗口添加unload
事件会导致后退/转发缓存被清除。
<强>更新。可能的解决方案:
BFCache可以给开发人员带来惊喜,因为至少在Firefox中,当向后/向前移动时,即使HTTP头被告知,页面也不会刷新。因此,最好假设页面不会刷新。另一方面,由于BFCache而导致页面与过期数据之间的区别,以及在浏览器中找到一个您多年没有重新加载的选项卡之间的区别是什么?
如果您关心这些事情,请编写一些javascript来检查服务器的更新并重新加载敏感信息。这是一个把你的问题变成胜利的机会。)
答案 2 :(得分:2)
如果您将Cache-Control: "no-cache, no-store, must-revalidate"
设置为http标头,则该页面不会缓存在后向缓存中。
Firefox还将beforeunload
事件上的事件处理程序视为不在BFC中存储页面的信号,但Safari会忽略此类处理程序,因此最好设置正确的http标头以指示页面内容的性质(可缓存或变量)
答案 3 :(得分:0)
要记住两个缓存:
bfcache(在Firefox和Safari中)将页面存储在内存中,包括对DOM的任何动态修改。按下时,Firefox和Safari使用它。为确保页面未存储在此缓存中,您需要运行以下行:
window.addEventListener('unload', function(){}); // Does nothing but break the bfcache in Firefox and Safari
请注意,Webkit文档将bfcache称为“页面缓存”。
除非在no-store
标题中设置了正确的Cache-Control
值,否则页面将缓存在常规浏览器缓存中。为了更加确定,请发送以下完整标头:
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private
Firefox和Safari在按“后退”按钮时将首先检查bfcache。然后,它们将退回到普通缓存。因此,您都需要向unload
添加一个事件侦听器,并设置此Cache-Control
HTTP标头。请注意,使用<meta>
代替HTTP标头可能不起作用。