我可以依靠 ETags 进行缓存控制吗

Posted

技术标签:

【中文标题】我可以依靠 ETags 进行缓存控制吗【英文标题】:Can I rely on ETags for cache control 【发布时间】:2013-12-30 23:57:51 【问题描述】:

我们当前的部署使用家庭构建缓存破坏方法:我们有一个映射文件,其中包含我们的 javascript 文件的哈希值(这个映射是在应用程序启动时创建的)。然后在我们的模板中使用这个文件中的值来生成一个脚本标签,其中包含一个用于缓存破坏的 GET 参数,即<script src="/static/js/somefile?v=adg34d>

我目前正在将整个页面转换为使用 RequireJS,并且我想摆脱这些缓存破坏参数,因为它们很难实现。我们的 HTTP 服务器配置为向它们服务的每个资产资源添加正确的 Last-ModifiedETag 标头。如果我查看 Chrome Web 控制台,我可以看到浏览器也使用它并获得正确的304。虽然我相信 Chrome 可以做到这一点,但当然还有其他浏览器。

问题是:如果我只使用 Last-ModifiedETag 标头可以依靠浏览器来正确处理,还是我真的需要缓存 -破坏参数?

我只需要支持:

歌剧 火狐 铬 IE >= 8 Safari >= 5

【问题讨论】:

使用您的原始方法,url 是不同的,您可以无限期地缓存它,知道如果它更改了 url 会更改,使用 etags 您将必须始终进行 304 检查以进行验证。如果您当前的方法使用 304,也不会发生任何变化,然后使用 ETags 会按描述工作,但是,由于请求是异步的,浏览器将经常解析为缓存。最终它会刷新(就像重新打开浏览器一样),但简单的 F5 并不总是有效。 【参考方案1】:

是的,您可以依赖浏览器,但等待304 响应可能需要很长时间。谷歌以更有效的方式做到这一点。 cache-busting 参数v 的每个值代表一个特定版本的文件。如果您不更改该值,浏览器将跳过版本验证并继续使用 Cache-ControlExpires 指示的本地缓存。

所以,这是性能和便利性之间的决定。

CASE 2. 如果您的文件不存在而是动态创建的(即实时合并一些脚本文件),您也需要该参数。

【讨论】:

以上是关于我可以依靠 ETags 进行缓存控制吗的主要内容,如果未能解决你的问题,请参考以下文章

SQL 最佳实践 - 可以依靠自动增量字段按时间顺序对行进行排序吗?

我可以依靠 charCodeAt() 和 fromCharCode() 的行为保持不变吗?

使用哪一个:Expire Header、Last Modified Header 或 ETags

我们可以依靠 String.isEmpty 来检查 Java 中字符串的空条件吗?

我可以依靠 malloc 返回 NULL 吗?

我可以依靠 C 中的 % (模)运算符来处理负数吗?