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"
.根据规范,缓存不应该在两个浏览器之间共享内容编码的缓存.这是真的?
首先,当实体确实因该标题(或其缺席)而变化时,IMHO不能发送"Vary:Accept-Encoding".
话虽如此,该规范目前确实不允许提供对Opera的缓存响应,因为根据HTTPbis第6部分第2.6节中的定义,Vary标头不匹配.也许这是我们应该放宽缓存要求的领域(您可能想要跟进IETF HTTP邮件列表 ...
更新:事实证明这已被标记为一个悬而未决的问题; 我刚刚在我们的问题跟踪器中添加了一个问题,请参阅问题147.