7

HTTP 服务器使用内容协商来提供基于客户端Accept-Encoding标头的单个 URL 标识或 gzip 编码。

现在假设我们在客户端和 httpd 之间有一个像 squid 这样的代理缓存。

如果代理已经缓存了 URL 的两种编码,它如何确定要服务哪个?

非 gzip 实例(最初不与 一起提供Vary)可以提供给任何客户端,但编码实例(具有Vary: Accept-Encoding)只能发送给具有与Accept-Encoding原始请求中使用的相同标头值的客户端。

例如 Opera 发送"deflate, gzip, x-gzip, identity, *;q=0"但 IE8 发送"gzip, deflate"。根据规范,缓存不应该在两个浏览器之间共享内容编码的缓存。这是真的?

4

3 回答 3

8

首先,恕我直言,当实体确实因该标头(或不存在)而异时,不发送“Vary: Accept-Encoding”是不正确的。

话虽如此,规范目前确实不允许向 Opera 提供缓存响应,因为 Vary 标头与HTTPbis 第 6 部分第 2.6 节中的定义不匹配。也许这是我们应该放宽缓存要求的领域(您可能需要跟进IETF HTTP 邮件列表...

更新:原来这已经被标记为一个未解决的问题;我刚刚在我们的问题跟踪器中添加了一个问题,请参阅问题 147

于 2009-03-29T17:28:16.047 回答
2

当然,朱利安是对的。教训:无论响应编码是什么,总是Vary: Accept-Encoding在嗅探时发送。Accept-Encoding

要回答我的问题,如果您错误地遗漏Vary了,如果代理收到未编码的响应(没有Vary),它可以简单地缓存并为每个后续请求返回它(忽略Accept-Encoding)。鱿鱼这样做

于 2009-03-29T20:20:10.157 回答
1

忽略 Vary 的一个大问题是,如果缓存接收到一个没有 Vary 的编码变体,那么它可能会发送它以响应其他请求,即使它们的 Accept-Encoding 指示客户端无法理解内容。

于 2010-03-17T20:28:19.367 回答