<html manifest="cache.manifest">
那么该页面(缓存中的主条目)将始终被缓存(至少由Safari),直到用户执行某些操作来删除缓存,即使您稍后从html标记中删除清单属性并更新清单(通过更改其中的东西),迫使主条目与其他一切重新加载。
换句话说,如果你有:
> index.html(带清单定义)
> file1.js(在清单中引用)
> file2.js(在清单中引用)
> cache.manifest(列出两个js
文件)
– 从index.html中删除清单条目并修改清单(因此浏览器和所有重新加载的内容都会过期)不会阻止该页面的行为完全缓存。如果您在index.html上查看源代码,您将不会再看到列出的清单,但是浏览器仍将仅请求cache.manifest文件,除非该文件的内容被更改,否则任何文件的其他更改都不会显示给用户。
它似乎是一个非常明显的bug,它出现在iOS以及Mac版本的Safari上。有没有人找到一种重置页面并摆脱缓存的方式,而不需要用户干预?
解决方法
以下是我找到的最好的资源:
http://www.html5rocks.com/tutorials/appcache/beginner/
http://www.thecssninja.com/javascript/how-to-create-offline-webapps-on-the-iphone
特别是从第一个链接引用:
If the manifest file or a resource specified in it fails to download,the entire update fails. The browser will continue to use the old application cache in the event of such a failure.
否则,关于卸载高速缓存的任何地方都没有提及。
似乎建议你不要强制一个错误来取消它。但是,如下所述,该规范表明,如果在下载清单文件时发生错误,则整个缓存将被删除。
在google chrome中,用户可以转到以下URL:
并手动禁用缓存。当然,当他们下次访问该页面时,如果该页面具有清单属性设置,那么它将被重新刷新。
如果你看规格:5.6 Offline Web applications
似乎建议缓存被删除的情况。具体来说,第5.6.4.5节:
If fetching the manifest fails due to a 404 or 410 response or equivalent,then run these substeps:
Mark cache group as obsolete. This cache group no longer exists for any purpose other than the processing of Document objects already associated with an application cache in the cache group.
If cache group has an application cache whose completeness flag is incomplete,then discard that application cache.
然后说:
If this was a cache attempt,discard cache group altogether.
基本上,如果缓存清单文件的请求导致404,那么整个缓存应该被丢弃。那么,当缓存清单文件被请求时,是否尝试使服务器返回404或410?这应该工作。诀窍是只返回要删除清单的页面的404/410(可能使用url参数?)。