压缩节省传输字节,但也制造了资源的另一种表示。客户端用 Accept-Encoding 声明可接受的内容编码;服务器用 Content-Encoding 描述实际应用的编码。
让协商可见
当响应可能随 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 传输分帧属于另一层。此外,该选项不保证服务器一定压缩,应查看真实响应,尤其是小文件与已经压缩过的文件。
来源
- RFC 9110 — HTTP Semantics,内容编码与
Vary,已核验 2026-10-15。 - Caddy
encode指令,内容编码选择与协商,已核验 2026-10-15。 - curl manual,
--compressed,已核验 2026-10-15。