HTML5脱机Appcache更新未在Firefox中显示

时间:2011-09-06 03:36:31

标签: html5 firefox offline-caching application-cache manifest.cache

我的docroot中有一个index.php文件。它产生以此开头的输出:

<!DOCTYPE html> 
<html manifest="manifest.appcache">

manifest.appcache告诉浏览器将其缓存以供离线使用。再次,相关部分:

CACHE MANIFEST

#version 8-25-2011

CACHE:

#internal HTML documents
#this tells the browser to cache the HTML it retrieves from http://example.com/
/

NETWORK:
*

使用此设置可以正常进行离线访问,但更新效果不如我在Firefox中所期望的那样。

在Chrome和Safari中,当我更新index.php文件然后更改cache.manifest文件中的注释时,浏览器将获取新的index.php输出并在缓存中使用它。

但是,在Firefox中,我似乎并不关心我是否更新了manifest.appcache文件。我怀疑,如果我等待足够长时间,它会更新,但我已经等了好几个小时。

如何找到并消除我的缓存问题?

2 个答案:

答案 0 :(得分:4)

您使用index.php文件发送了哪些HTTP缓存标头?如果您没有设置Cache-control:Expires:标题之类的内容,则Firefox可以从其常规缓存中刷新页面的应用程序缓存版本,而不是再次从服务器请求它。

按照问题的海报编辑

对于任何想知道具体内容的人来说,这就是我根据这个答案和http://www.diveintohtml5.info/offline.html阅读我的.htaccess文件中的内容:

<Files *.appcache>
    ExpiresActive On
    ExpiresDefault "access"
</Files>

希望能帮助下一个人!

答案 1 :(得分:0)

我知道我参加派对的时间已经很晚了,但我已经在Firefox中看到了这个问题多年,并且希望能够修复底层错误。

不幸的是,这并没有发生,但我终于想出了一个解决方法。在我的情况下,在加载和处理新的.appcache文件时,页面重新加载不会导致使用新的缓存版本。我使用的流程如下:

  1. index.html已加载,并在html标记中指定.appcache文件。
  2. .appcache文件是使用PHP脚本动态生成的。该脚本会散列所有包含的文件以创建唯一版本哈希,该哈希包含在清单中。这意味着清单中列出的任何文件的更改都会强制重新加载缓存。
  3. 我的.htaccess文件具有以下内容以防止缓存.appcache清单:

    <Files *.appcache> ExpiresActive On ExpiresDefault "access plus 0 seconds" </Files>

  4. 我的Javascript代码检测到appcache更新,并在获取更新的文件后重新加载页面:

    appCache.addEventListener('updateready', function(e) { console.log("Appcache update finished, reloading..."); setLoadingBar(100, "Loading..."); appCache.swapCache(); location.reload(); });

  5. 页面重新加载后,旧的缓存仍在Firefox中使用,直到用户手动清除缓存。在我测试过的所有其他浏览器中,新缓存的文件会立即生效。

  6. 修复结果非常简单!

    所需要的只是更改location.reload()行以包含真实参数:

    location.reload(true)

    这似乎表明Firefox使用其正常缓存而不是使用appcache存储文件来提供文件,即使appcache文件较新也是如此。我猜这是因为Firefox将正常的缓存机制放在​​appcache之前,如下所示:

    请求 - &gt;普通缓存 - &gt; Appcache - &gt;网络请求

    但这只是猜测。