【问题标题】:What are the uses for If-None-Match with multiple entities?If-None-Match 与多个实体有什么用途?
【发布时间】:2017-03-04 08:19:08
【问题描述】:

我使用ETag 标头进行缓存,浏览器发送相应的If-None-Match 标头。最初,我只是简单地比较了这些标头,它就奏效了。

后来我想到rfc2616 允许实体列表,所以我修复了它。问题是,如果修复被使用...

  • 浏览器是否曾经发出带有包含多个实体的 If-None-Match 标头的请求?
  • 还有其他实际用途吗?

【问题讨论】:

  • 您可以参考RFC 7230ff。 2616 已经过时了一段时间。不过,问题仍然存在。稍后我会研究它,听起来很有趣:)
  • 权责:可能是 WebDAV 使用的版本控制方案需要这个。

标签: http caching browser-cache rfc2616


【解决方案1】:

我最近阅读了很多关于缓存机制的文章,发现自己也在问同样的问题。我能想到的唯一用例(除了 Leonid 提到的那些)在其中存储和发送多个 ETags 是有意义的:当资源回滚时。

可能是意外,例如提供 json 的 api,并且底层数据经常更新,以恢复到以前版本的方式。

但也可能是按设计,一个大的配置对象可能只有几个不同的版本,这会被切换很多。 (改变它的频率很重要,否则缓存不会带来很多价值)。在这种情况下,缓存会很高兴所有可用的版本都随时可以提供服务。

我知道这是一个很长的尝试,我想不出任何适合其中之一的真实情况。此外,无论如何,重新验证都很糟糕,缓存命中是要走的路=)

另外,您可能想阅读this。似乎所有缓存都只存储最后发送的ETag(由于明显的内存原因,这是可以理解的)。

希望对你有帮助

【讨论】:

    【解决方案2】:

    我能想到两个用例:浏览器和缓存代理实体标签的联合以及自定义客户端缓存实现。

    虽然,我从未见过浏览器在If-None-Match 中使用多个实体标签来处理请求,但缓存代理可能拥有自己的请求资源版本。他们可以在将请求进一步发送到服务器之前,将浏览器发送的If-None-Match 的值替换为浏览器的资源版本实体标签和代理资源版本实体标签的联合。这样,如果代理具有所请求资源的新版本,您可以通过从代理而不是服务器提供完整响应(带有正文有效负载)来减少服务器负载。本案例由RFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Caching描述:

    当缓存决定重新验证自己存储的响应时 包含实体标签的 If-None-Match 列表的请求,缓存 可以将接收到的列表与它自己的实体标签列表结合起来 存储的响应集(新的或陈旧的)并发送联合 两个列表作为替换 If-None-Match 头字段值 转发请求。

    我不能说对 RFC 7234 的那部分的支持是否广泛,但肯定有支持它的代理。检查 Colin Mollenhour 的 Node.js Caching Reverse HTTP Proxy 项目。

    另一方面,您可能不想依赖浏览器来执行条件请求。您可以使用XMLHttpRequest.setRequestHeader() 自行设置If-None-Match HTTP 标头值。如果您使用Web Storage APICache API 或其他机制存储资源的多个版本,这将很有用。服务器响应必须包含带有实体标签的ETag HTTP 标头。此实体标签指示资源的哪个版本被认为是新鲜的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2014-05-09
      • 2014-07-22
      • 1970-01-01
      相关资源
      最近更新 更多