🔗 GZIP 编码的变体被非压缩对象替换
🔗 摘要
Squid 可以很好地存储压缩的响应变体,但非压缩的响应会导致所有后续响应都为非压缩。
🔗 症状
- 初始请求包含 Accept-Encoding: gzip (或类似内容);
- 响应是 Content-Encoded gzip 响应,并设置了正确的 Vary: 标头;
- 后续请求 w/ Accept-Encoding: gzip 返回缓存的 gzip 压缩响应;
- 没有 Accept-Encoding: gzip 标头的请求会导致缓存请求一个非压缩的变体;
- Squid 将该特定对象的缓存变体副本替换为单个非压缩变体;
- 并且后续请求,无论是压缩还是非压缩,都返回未压缩的对象。
🔗 解释
(待定:查找 RFC 中的相关部分。)
对于缓存,可以为 Accept-Encoding: gzip 或类似请求提供非压缩响应。如果对象的所有可能响应都不包含 Vary: 标头,Squid 就无法知道一个对象有多种变体类型。
总而言之,Squid 做得没错。源服务器需要设置正确的 ETag 和 Vary: 标头,以便正确缓存和提供变体内容。
🔗 规避方法
- 确保源服务器为压缩和非压缩响应都设置 Vary: Accept-Encoding,否则 Squid 会将 Vary 对象替换为单个非压缩对象。
- 确保源服务器为每个变体响应类型设置不同的 ETag - 即,压缩和未压缩的 ETag 不同 - 否则浏览器/缓存将认为响应是等效的。
🔗 另请参阅
🔗 致谢
- HenrikNordstrom
- 提供关于 Vary 代码行为的信息
类别: 知识库
导航: 站点搜索、站点页面、类别、🔼 向上