我有一个使用AppCache将资源存储在浏览器缓存中的应用程序。我已经能够在PHP文件上设置清单,以便自动写入必须缓存(正确过滤)的所有文件。该文件的标题如下:
header('Content-Type: text/cache-manifest');
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
它被称为appcache.php
,并且在我的HTML中正确引用了它:
<html manifest="appcache.php">
每次我更新清单时,应用检测到更新并正确触发事件,更新缓存并刷新页面以便重新加载。
然而,某些文件(主要是Javascript和CSS文件)无法正常刷新。有时它需要一些清单更新(整个过程),有时它只需要一个,有时它需要永远,我必须删除浏览器缓存或隐身模式
该应用会检测到更新,因此清单不会被捕获并且它会正确更新。问题是,即使文件再次下载,它们仍然以旧版本提供。主要问题是这只发生在一些文件中(有时它们是某些 css 文件,有时它们是 js ,依此类推:< strong>未更新的文件是随机的)。
实际上,我使用的是Chrome v59,在我的Android设备上使用Chrome v60时也是如此。
有没有解释为什么他们没有正确刷新?这是一个已知的错误?我有什么办法可以解决它吗?
更新
当我在他们之间完成一些短时间的更新时,似乎发生了最多的事情。在等待24小时后,它在第一次尝试时起作用。也许这可以帮助你猜出它为什么会发生。
谢谢。
答案 0 :(得分:0)
您的清单文件可能会被缓存,您可以设置它的expires标头立即过期
我建议添加swapCache方法
$(function() {
if (window.applicationCache) {
applicationCache.addEventListener('updateready', function() {
if (window.applicationCache.status ==
window.applicationCache.UPDATEREADY) {
window.applicationCache.swapCache();
console.log("appcache updated");
window.location.reload();
}
});
}
}
其他方面,要强制下载任何新的(或更改的)文件,您必须这样做 更新清单文件(看起来你正在这样做)。
最常见的一个是您可能没有使用正确的mime类型(text / cache-manifest)提供清单。
您可能会收到错误,检查错误的最简单方法是在Chrome中打开该页面,然后在AppCache下的控制台和资源标签中查看是否有错误(它会抱怨正在提供的文件)您也可以使用curl -I命令测试它:
curl -I $manifest_file_URL