压缩节省传输字节,但也制造了资源的另一种表示。客户端用 Accept-Encoding 声明可接受的内容编码;服务器用 Content-Encoding 描述实际应用的编码。

协商分支选择 identity 字节 A 或编码后字节 B,因此强标签不同。Vary 控制匹配,弱标签有语义等价的条件。另一路径说明响应头保留编码后 Content-Length,curl 解码正文后才与制品校验和比较。
压缩选择的是表示字节,协商、缓存匹配与验证器必须一致。编码后字节不同就需要不同强标签。下载正文解码后再与制品比较;编码后 Content-Length 不必等于解码文件大小。

让协商可见

当响应可能随 Accept-Encoding 变化时,把该请求字段写进 Vary。这告诉共享缓存:压缩响应与 identity 响应不是可互换的缓存条目。

不要只检查一个浏览器请求,而是比较两条路径:

curl -sS -D - -o /dev/null \
  -H 'Accept-Encoding: identity' https://www.example.test/
curl -sS --compressed -D - -o /dev/null \
  https://www.example.test/

检查 Content-Encoding、Vary、Content-Length(如存在)与验证器。当内容编码改变表示字节时,强实体标签必须不同。语义等价的变体可以共享弱标签,但它不能用于强比较。条件请求必须针对同一个协商出的表示检查。

压缩合适的内容

HTML、CSS、JSON、XML、SVG 等文本格式通常适合压缩;已经压缩过的格式未必适合。Caddy 的 encode 指令会协商支持的编码,并且通常对没有合适内容类型或体积过小的响应不做压缩。

不要为了满足某个评分而加压缩。测量一个有代表性的响应,确认边缘返回预期的头,并核验可下载文件在传输解码后仍保留正确的内容类型与校验和。

使用 --compressed 时,curl 自动解码正文,但保存的响应头不会随之改写。若存在 Content-Length,它描述的是编码后内容,未必等于解码后下载文件的大小。应在内容解码后才把校验和与制品比较;HTTP 传输分帧属于另一层。此外,该选项不保证服务器一定压缩,应查看真实响应,尤其是小文件与已经压缩过的文件。

来源