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"。根据规范,缓存不应该在两个浏览器之间共享内容编码的缓存。这是真的吗?
发布于 2009-03-29 17:28:16
首先,当实体确实因头(或不存在)而变化时,不发送"Vary: Accept-Encoding“是不正确的。
尽管如此,规范目前确实不允许为对Opera的缓存响应服务,因为根据HTTPbis,第6部分,2.6节中的定义不同的头不匹配。也许这是一个我们应该放松对缓存的需求的领域(您可能需要对IETF HTTP邮件列表进行跟踪.
更新:原来这已经被标记为一个开放问题;我刚刚在我们的问题跟踪器中添加了一个问题,请参阅第147期。
发布于 2009-03-29 20:20:10
朱利安当然是对的。教训:无论响应编码如何,在嗅探Vary: Accept-Encoding Accept-Encoding,时,总是发送。
为了回答我的问题,如果您错误地忽略了Vary,如果代理接收到一个非编码响应(没有Vary),它可以简单地缓存并返回每个后续请求(忽略Accept-Encoding)。鱿鱼干的。
发布于 2010-03-17 20:28:19
忽略差异的最大问题是,如果缓存接收到的编码变体没有变化,那么它可能会根据其他请求发送该变体,即使这些请求的接受编码表明客户端无法理解内容。
https://stackoverflow.com/questions/694918
复制相似问题