20

似乎一旦你有一个清单条目,a 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 上。有没有人找到一种无需用户干预即可重置页面并清除缓存的方法?

4

7 回答 7

17

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

  1. 动态触发页面被缓存
  2. 动态地导致页面停止被缓存。

以下是我找到的最佳资源:

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

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

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

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

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

似乎表明您不能强制错误以使其取消缓存。但是,如下所述,规范建议如果在下载清单文件时发生错误,则将删除整个缓存。

在谷歌浏览器中,用户可以访问以下 URL:

chrome://appcache-internals/

并手动禁用缓存。当然,下次他们访问该页面时,如果该页面设置了 manifest 属性,它将被重新缓存。

如果您查看规范:5.6 离线 Web 应用程序

这似乎暗示了缓存被删除的情况。具体来说,第 5.6.4.5 节:

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

然后它说:

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

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

于 2010-12-28T18:36:49.583 回答
4

一种可能的解决方案:

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

几乎没有优雅,但它似乎工作。那么主要的问题是你被这个生成 404 的虚假清单条目所困扰,直到曾经访问过你网站的每个人都返回并清除了他们的缓存。

必须有更好的方法...

于 2010-12-27T22:51:40.873 回答
2

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

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

这在 chrome 上也适用于我。

于 2012-02-22T08:46:13.447 回答
1

如果您使用的是 IIS 7,一种解决方案是删除为启用缓存而添加的 .manifest 或 .appcache 文件类型的 Mime 类型。当您想再次启用缓存时,您可以随时将其添加回来。这就是我为解决我的问题所做的。

于 2013-07-30T04:57:46.513 回答
1

我们所做的是删除清单中的文件列表,因此不会缓存任何文件。

它对我们有用。

于 2014-04-07T15:31:34.977 回答
0

这可能很旧,但希望仍然对某人有所帮助。

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

于 2011-10-14T21:00:40.730 回答
0

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

  1. 在您的 SERVER-SIDE 语言下设置 -cache manifest file-,例如,我们使用 PHP,因此我们的开发缓存称为“cache.manifest.php”,它在 html 标记中以相同的方式指向,如下所示:

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

    <?php if($dev) echo date("Y-m-d H:m"); ?>
    

我们刚刚使用 Chrome 测试了此过程,希望它适用于其他人,但如果不是,您的意见和建议将非常感激。

于 2016-11-19T21:33:49.327 回答