一旦HTML文档有一个清单(cache.manifest),你怎么能删除它?

时间:2010-12-27 22:32:46

标签: html5 safari offline-browsing

似乎一旦你有一个清单条目,就是la:

<html manifest="cache.manifest">

然后该页面(缓存中的主条目)将始终被缓存(至少通过Safari),直到用户执行删除缓存的操作,即使您稍后从html标记中删除清单属性并更新清单(通过更改其中的内容),强制主条目与其他所有内容一起重新加载。

换句话说,如果你有:

  • index.html(已定义清单)
  • file1.js(在清单中引用)
  • file2.js(在清单中引用)
  • cache.manifest(列出两个js 文件)

- 从index.html中删除清单条目并修改清单(因此它被浏览器过期并重新加载所有内容)不会阻止此页面表现得好像它仍然完全缓存一样。如果您在index.html上查看源代码,您将不再看到列出的清单,但浏览器仍将仅请求cache.manifest文件,除非该文件的内容已更改,否则不会对任何文件进行任何其他更改。用户。

这似乎是一个非常明显的错误,它存在于iOS以及Mac版本的Safari中。有没有人找到一种方法来重置页面并摆脱缓存而无需用户干预?

7 个答案:

答案 0 :(得分:17)

我一直在研究同样的问题,它似乎不是一个api:

  1. 动态触发页面缓存
  2. 动态地导致页面停止缓存。
  3. 以下是我找到的最佳资源:

    http://www.html5rocks.com/tutorials/appcache/beginner/

    http://www.thecssninja.com/javascript/how-to-create-offline-webapps-on-the-iphone

    特别是第一个链接的引用:

      

    如果清单文件或其中指定的资源无法下载,则整个更新将失败。如果发生此类故障,浏览器将继续使用旧的应用程序缓存。

    否则,任何地方都没有提及卸载缓存。

    似乎暗示您无法强制执行错误以使其无法解除。但是,如下所述,该规范建议如果在下载清单文件时发生错误,则将删除整个缓存。

    在Google Chrome中,用户可以转到以下网址:

    chrome://appcache-internals/

    并手动禁用缓存。当然,下次他们访问页面时,如果页面设置了清单属性,则会对其进行重新跟踪。

    如果你看一下规范:5.6 Offline Web applications

    似乎建议删除缓存的情况。具体而言,第5.6.4.5节:

      

    如果由于404或410响应或等效响应而获取清单失败,则运行以下子步骤:   将缓存组标记为已过时。除了处理已与缓存组中的应用程序缓存关联的Document对象之外,此缓存组不再用于任何其他目的。   如果缓存组具有完整性标记不完整的应用程序缓存,则丢弃该应用程序缓存。

    然后说:

      

    如果这是缓存尝试,请完全丢弃缓存组。

    基本上,如果对缓存清单文件的请求导致404,则应丢弃整个缓存。那么,您是否尝试过在请求缓存清单文件时服务器返回404或410?这应该工作。诀窍是只返回要删除清单的页面的404/410(可能使用url参数?)。

答案 1 :(得分:4)

一种可能的解决方案:

  • 修改清单(以便重新加载)
  • 修改主文件(index.html)以引用不存在的清单,因此它获得404

很优雅,但似乎有效。接下来的主要问题是,您已经遇到了这个生成404的虚假清单条目,直到所有访问过您网站的人都返回并清除了缓存。

必须有更好的方法......

答案 2 :(得分:2)

尝试简单地删除清单文件。来自mozzila文档:

  

应用程序缓存也可能过时。如果清单从服务器中删除,浏览器将删除使用该清单的所有应用程序缓存,然后将“已过时”的事件发送到应用程序缓存对象。然后,应用程序缓存的状态设置为OBSOLETE。

这对我来说也很有用。

答案 3 :(得分:1)

一种解决方案,如果您使用的是IIS 7,则删除为添加启用缓存而添加的.manifest或.appcache文件类型的Mime类型。如果要再次启用缓存,可以随时添加此项。这就是我修复我的方法。

答案 4 :(得分:1)

我们所做的是删除清单中的文件列表,因此它突出显示没有文件将被缓存。

它对我们有用。

答案 5 :(得分:0)

这可能已经过时但仍然对某人有帮助。

查看IIS属性中的HTTP标头。请查看启用或禁用内容过期。可能是IIS仍在执行缓存。

答案 6 :(得分:0)

出于开发目的(不断变化),我们所做的是:

  1. 在SERVER-SIDE语言下设置-cache清单文件,例如,我们使用PHP,因此我们的开发缓存被称为&#34; cache.manifest.php&#34;并且它在html标签中以相同的方式指出:

    <html manifest="cache.manifest.php">
    
  2. 在清单中的某个地方放置一些依赖字符串(或其他适合你的东西)作为注释(#---),以便文件每隔一段时间就不同(浏览器似乎比较清单的内容,而不是日期),例如,此字符串每分钟更改一次清单,这样,如果访问时间与上次不同,则会重新缓存所有文件。

    <?php if($dev) echo date("Y-m-d H:m"); ?>
    
  3. 我们刚刚使用Chrome测试了这个程序,希望它适用于其他人,但如果没有,您的意见和建议将会非常受欢迎。