3

我的 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 文件。我怀疑如果我等待足够长的时间,它会更新,但我已经尝试等待几个小时。

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

4

2 回答 2

4

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

通过问题的海报编辑

对于任何想知道它到底需要什么的人,这是我根据这个答案和阅读http://www.diveintohtml5.info/offline.html在我的 .htaccess 文件中放入的内容:

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

希望对下一个人有帮助!

于 2011-09-06T08:14:41.703 回答
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 中使用,直到用户手动清除缓存。在我测试过的所有其他浏览器中,新缓存的文件会立即生效。

修复结果非常简单!

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

location.reload(true)

这似乎表明 Firefox 从它的普通缓存中提供文件,而不是使用 appcache 存储的文件,即使 appcache 的文件较新。我猜这是因为 Firefox 将正常的缓存机制放在​​ appcache 前面,如下所示:

请求 -> 普通缓存 -> Appcache -> 网络请求

但这只是一个猜测。

于 2017-02-25T02:59:28.530 回答