似乎一旦你有一个清单条目,就是la:
<html manifest="cache.manifest">
然后该页面(缓存中的主条目)将始终被缓存(至少通过Safari),直到用户执行删除缓存的操作,即使您稍后从html标记中删除清单属性并更新清单(通过更改其中的内容),强制主条目与其他所有内容一起重新加载。
换句话说,如果你有:
- 从index.html中删除清单条目并修改清单(因此它被浏览器过期并重新加载所有内容)不会阻止此页面表现得好像它仍然完全缓存一样。如果您在index.html上查看源代码,您将不再看到列出的清单,但浏览器仍将仅请求cache.manifest文件,除非该文件的内容已更改,否则不会对任何文件进行任何其他更改。用户。
这似乎是一个非常明显的错误,它存在于iOS以及Mac版本的Safari中。有没有人找到一种方法来重置页面并摆脱缓存而无需用户干预?
答案 0 :(得分:17)
我一直在研究同样的问题,它似乎不是一个api:
以下是我找到的最佳资源:
http://www.html5rocks.com/tutorials/appcache/beginner/
http://www.thecssninja.com/javascript/how-to-create-offline-webapps-on-the-iphone
特别是第一个链接的引用:
如果清单文件或其中指定的资源无法下载,则整个更新将失败。如果发生此类故障,浏览器将继续使用旧的应用程序缓存。
否则,任何地方都没有提及卸载缓存。
似乎暗示您无法强制执行错误以使其无法解除。但是,如下所述,该规范建议如果在下载清单文件时发生错误,则将删除整个缓存。
在Google Chrome中,用户可以转到以下网址:
并手动禁用缓存。当然,下次他们访问页面时,如果页面设置了清单属性,则会对其进行重新跟踪。
如果你看一下规范:5.6 Offline Web applications
似乎建议删除缓存的情况。具体而言,第5.6.4.5节:
如果由于404或410响应或等效响应而获取清单失败,则运行以下子步骤: 将缓存组标记为已过时。除了处理已与缓存组中的应用程序缓存关联的Document对象之外,此缓存组不再用于任何其他目的。 如果缓存组具有完整性标记不完整的应用程序缓存,则丢弃该应用程序缓存。
然后说:
如果这是缓存尝试,请完全丢弃缓存组。
基本上,如果对缓存清单文件的请求导致404,则应丢弃整个缓存。那么,您是否尝试过在请求缓存清单文件时服务器返回404或410?这应该工作。诀窍是只返回要删除清单的页面的404/410(可能使用url参数?)。
答案 1 :(得分:4)
一种可能的解决方案:
很优雅,但似乎有效。接下来的主要问题是,您已经遇到了这个生成404的虚假清单条目,直到所有访问过您网站的人都返回并清除了缓存。
必须有更好的方法......
答案 2 :(得分:2)
尝试简单地删除清单文件。来自mozzila文档:
应用程序缓存也可能过时。如果清单从服务器中删除,浏览器将删除使用该清单的所有应用程序缓存,然后将“已过时”的事件发送到应用程序缓存对象。然后,应用程序缓存的状态设置为OBSOLETE。
这对我来说也很有用。
答案 3 :(得分:1)
一种解决方案,如果您使用的是IIS 7,则删除为添加启用缓存而添加的.manifest或.appcache文件类型的Mime类型。如果要再次启用缓存,可以随时添加此项。这就是我修复我的方法。
答案 4 :(得分:1)
我们所做的是删除清单中的文件列表,因此它突出显示没有文件将被缓存。
它对我们有用。
答案 5 :(得分:0)
这可能已经过时但仍然对某人有帮助。
查看IIS属性中的HTTP标头。请查看启用或禁用内容过期。可能是IIS仍在执行缓存。
答案 6 :(得分:0)
出于开发目的(不断变化),我们所做的是:
在SERVER-SIDE语言下设置-cache清单文件,例如,我们使用PHP,因此我们的开发缓存被称为&#34; cache.manifest.php&#34;并且它在html标签中以相同的方式指出:
<html manifest="cache.manifest.php">
在清单中的某个地方放置一些依赖字符串(或其他适合你的东西)作为注释(#---),以便文件每隔一段时间就不同(浏览器似乎比较清单的内容,而不是日期),例如,此字符串每分钟更改一次清单,这样,如果访问时间与上次不同,则会重新缓存所有文件。
<?php if($dev) echo date("Y-m-d H:m"); ?>
我们刚刚使用Chrome测试了这个程序,希望它适用于其他人,但如果没有,您的意见和建议将会非常受欢迎。