HTTP代理缓存如何在服务标识和gzip编码资源之间做出决定?

HTTP代理缓存如何在服务标识和gzip编码资源之间做出决定?,http,caching,proxy,reverse-proxy,content-encoding,Http,Caching,Proxy,Reverse Proxy,Content Encoding,HTTP服务器使用内容协商来提供单个URL标识,或基于客户端的接受编码头编码的gzip 现在假设我们在客户端和httpd之间有一个类似squid的代理缓存 如果代理缓存了URL的两种编码,它如何确定服务于哪种编码? 非gzip实例(最初未使用Vary)可以提供给任何客户端,但编码实例(具有Vary:Accept Encoding)只能发送给具有与原始请求中使用的相同Accept Encoding头值的客户端 例如,Opera发送“deflate,gzip,x-gzip,identity,*;q=

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

现在假设我们在客户端和httpd之间有一个类似squid的代理缓存

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

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


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

首先,当实体确实因该标头(或其缺失)而变化时,不发送“Vary:Accept Encoding”是不正确的

这就是说,规范目前确实不允许向Opera提供缓存响应,因为Vary头与中的定义不匹配。也许这是一个我们应该放松缓存要求的领域(你可能想跟进


更新:原来这已经被标记为一个开放问题;我刚刚在我们的问题跟踪程序中为它添加了一个问题,请参阅。

朱利安当然是对的。课程:总是发送
变化:接受编码
嗅探
接受编码
时,无论响应编码是什么


为了回答我的问题,如果您错误地将
Vary
排除在外,如果代理接收到非编码响应(没有
Vary
),它可以简单地缓存并为每个后续请求返回该响应(忽略
接受编码
)..

省略Vary的一个大问题是,如果缓存接收到编码的变体而没有Vary,那么它可能会发送该变体以响应其他请求,即使它们的接受编码表明客户端无法理解内容