8

我正在使用ETag标头进行缓存,浏览器发送相应的If-None-Match标头。最初,我只是比较了这些标头并且它起作用了。

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

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

2 回答 2

4

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

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

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

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

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

于 2017-04-27T08:37:17.703 回答
2

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

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

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

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

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

希望这可以帮助

于 2018-03-08T18:19:25.930 回答