压缩节省传输字节,但也制造了资源的另一种表示。客户端用 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 指令会协商支持的编码,并且通常对没有合适内容类型或体积过小的响应不做压缩。
不要为了满足某个评分而加压缩。测量一个有代表性的响应,确认边缘返回预期的头,并核验可下载文件在传输解码后仍保留正确的内容类型与校验和。
来源
- RFC 9110 — HTTP Semantics,内容编码与
Vary,已核验 2026-08-22。 - Caddy
encode指令,内容编码选择与协商,已核验 2026-08-22。 - curl manual,
--compressed,已核验 2026-08-22。