If-None-Match与多个实体有什么用途?

maa*_*nus 7 caching http browser-cache rfc2616

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

后来我发现rfc2616允许实体列表,所以我修复了它.问题是,如果修复程序被使用过......

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

Leo*_*lev 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 标头。该实体标签指示哪个版本的资源被认为是最新的。