【问题标题】:How to prevent content being displayed from Back-Forward cache in Firefox?如何防止内容从 Firefox 的 Back-Forward 缓存中显示?
【发布时间】:2011-08-30 18:40:18
【问题描述】:

浏览器: Firefox 6.0

我的页面 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"/>

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

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

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

知道我错过了什么吗?

提前致谢!

【问题讨论】:

    标签: firefox cache-control browser-cache


    【解决方案1】:

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

    您在上面显示的&lt;meta&gt; 标记在当前的 Chrome 或 Firefox 中绝对无效。它们可能对 IE 有影响。

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

    如果您真的想发送无缓存 HTTP 标头,您应该这样做。但它们必须是实际的 HTTP 标头:正如我上面所说,&lt;meta&gt; 标签“等价物”什么都不做。

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

    【讨论】:

    • 谢谢!以下 HTTP 标头已经可用:Cache-Control: no-cache Pragma: no-cache Expires: -1 不幸的是,它们也没有帮助。在您回复后,我重新访问了标头,发现 Firefox 需要另一个标头来防止缓存:blog.httpwatch.com/2008/10/15/…Cache-Control: no-cache, no-store 添加上述标头后,它现在可以在 IE、Firefox、Chrome 和 Safari 中正常运行。只有 Opera 仍然存在缓存问题,但我将暂时推迟该问题。
    • 另一个注意事项:如果站点启用了 SSL,Firefox 不会存储在 bfcache 中!我的生产系统是 SSL,而 DEV 系统不是。因此,生产系统在 Firefox 中运行良好,无需任何额外的 HTTP 标头,如上面提到的!
    • 这取决于您的 HTTP 标头。 SSL + no-cache 不会存储在 bfcache 中,但可缓存的 SSL 会。
    • 正确! no-cache 标头在我的案例中已经存在。 “附加 HTTP 标头”是指 no-store 标头;如果使用 SSL,则不需要!
    【解决方案2】:

    如果您将 Cache-Control: "no-cache, no-store, must-revalidate" 设置为 http 标头,则页面不会被缓存在后向缓存中。

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

    【讨论】:

    • 非常感谢,经过 3 天的研究,您救了我!
    • HTTP 标头只影响普通缓存,而不影响 bfcache(在 Firefox 中)。为了更加确定,您需要设置标题和设置unload 事件。当按下返回时,Firefox 将使用 bfcache,如果不起作用,则回退到正常缓存,因此您需要确保页面没有缓存在两者中。
    【解决方案3】:

    下面的答案不再有效:

    answer on SO 开始,将unload 事件添加到窗口会导致后退/前进缓存被清除。

    更新。可能的解决方案:

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

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

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

    【讨论】:

    • 后向/前向缓存 === bfcache
    • 我无法通过将unload 事件添加到像window.onunload = function () { console.log('lets unload windows');} 这样的窗口来使bfcache 无效。您能否更具体地说明如何操作?非常感谢。
    • 我在jakearchibald.com/jsperformance/backforwardcache 尝试了示例,结果它也不起作用。
    • 我试过 $(window).unload(function(){});,仍然从 bf 缓存加载页面
    • HTTP 标头只影响普通缓存,而不影响 bfcache(在 Firefox 中)。为了更加确定,您需要设置标题并设置unload 事件。当按下返回时,Firefox 将使用 bfcache,如果这不起作用,则回退到正常缓存,因此您需要确保页面没有缓存在两者中。
    【解决方案4】:

    要记住两个缓存:

    bfcache(后向缓存)

    bfcache(在 Firefox 和 Safari 中)将页面存储在内存中,包括对 DOM 的任何动态修改。 Firefox 和 Safari 在按下返回时使用它。要确保该页面没有存储在此缓存中,您需要运行此行:

    window.addEventListener('unload', function(){}); // Does nothing but break the bfcache in Firefox and Safari
    

    请注意,Webkit 文档将 bfcache 称为“页面缓存”。

    普通浏览器缓存

    页面缓存在普通浏览器缓存中,除非您在Cache-Control 标题中设置了正确的no-store 值。为了更加确定,请发送完整的标头:

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

    Firefox 和 Safari 在按下返回按钮时会首先检查 bfcache。然后它们将回退到正常缓存。所以你需要给unload添加一个事件监听器,并设置这个Cache-Control HTTP头。请注意,使用 &lt;meta&gt; 代替 HTTP 标头可能不起作用。

    【讨论】:

    • Chrome 在 Android 和桌面(测试版)中也有一个后向缓存,我认为。
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2019-07-20
    • 2013-08-03
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多