我的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文件。我怀疑,如果我等待足够长时间,它会更新,但我已经等了好几个小时。
如何找到并消除我的缓存问题?
答案 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文件时,页面重新加载不会导致使用新的缓存版本。我使用的流程如下:
我的.htaccess文件具有以下内容以防止缓存.appcache清单:
<Files *.appcache>
ExpiresActive On
ExpiresDefault "access plus 0 seconds"
</Files>
我的Javascript代码检测到appcache更新,并在获取更新的文件后重新加载页面:
appCache.addEventListener('updateready', function(e) {
console.log("Appcache update finished, reloading...");
setLoadingBar(100, "Loading...");
appCache.swapCache();
location.reload();
});
页面重新加载后,旧的缓存仍在Firefox中使用,直到用户手动清除缓存。在我测试过的所有其他浏览器中,新缓存的文件会立即生效。
修复结果非常简单!
所需要的只是更改location.reload()
行以包含真实参数:
location.reload(true)
这似乎表明Firefox使用其正常缓存而不是使用appcache存储文件来提供文件,即使appcache文件较新也是如此。我猜这是因为Firefox将正常的缓存机制放在appcache之前,如下所示:
请求 - &gt;普通缓存 - &gt; Appcache - &gt;网络请求
但这只是猜测。