Javascript HTML5-ApplicationCache不更新(仅)某些文件

Javascript HTML5-ApplicationCache不更新(仅)某些文件,javascript,html,caching,cache-manifest,application-cache,Javascript,Html,Caching,Cache Manifest,Application Cache,我有一个应用程序正在使用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=

我有一个应用程序正在使用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文件,等等:未更新的文件是随机的

事实上,我使用的是ChromeV59,在我的Android设备上使用ChromeV60也是一样

有没有解释为什么它们不能正确刷新?这是已知的bug吗?有什么我能解决的吗

更新

当我在短时间内完成了一些更新时,这种情况似乎发生得最多。在等待24小时左右后,它在第一次尝试时工作。也许这能帮你猜出为什么会这样


谢谢。

您的清单文件可能正在缓存,您可以将其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类型(文本/缓存清单)

您可能会遇到错误,检查错误的最简单方法是在Chrome中打开页面,查看控制台和AppCache下的resources选项卡,查看是否存在错误(它会抱怨文件提供不正确。您还可以使用curl-I命令对其进行测试:

curl -I $manifest_file_URL  

您的清单文件可能正在缓存,您可以将其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类型(文本/缓存清单)

您可能会遇到错误,检查错误的最简单方法是在Chrome中打开页面,查看控制台和AppCache下的resources选项卡,查看是否存在错误(它会抱怨文件提供不正确。您还可以使用curl-I命令对其进行测试:

curl -I $manifest_file_URL  

它正确地完成了整个过程,并且清单得到了更新(或者不会触发事件)。没有错误,也没有。而且它没有被捕获,因为应用程序检测到它已经更改。问题是一些文件刷新,而其他文件(主要是js和css)没有。它正确地完成了整个过程,清单得到了更新(或者不会触发事件)。也没有错误。而且不会被捕获,因为应用程序检测到它已更改。问题是一些文件刷新,而其他文件(主要是js和css)刷新不要。你有没有找到解决这个问题的方法?恐怕我不能……我希望他们现在已经解决了,或者至少改进了,也许是和服务人员一起解决的(自从上次我使用离线缓存以来,已经有很多了).你找到解决方案了吗?恐怕我找不到…我希望他们现在已经解决了,或者至少改进了,也许是与服务人员一起解决的(自从上次我使用脱机缓存以来,这已经很多了)。