首页/网络/协议速查/Content-Encoding 内容编码
HTTP 头与缓存70 条

Content-Encoding 内容编码

对表示数据施加的压缩/编码方式(gzip/br/deflate/identity),是端到端属性:链路上每一跳看到的都是已编码内容。

协议速查网络更新于 2026-10-13

这个头在声明什么

Content-Encoding 声明表示层被施加了什么编码(gzip、br、deflate、identity),接收方必须按它解码才能拿到原始内容。它是表示的属性,属于端到端:链路上每一跳看到的都是同一段已编码字节(RFC 9110 §8.4)。

与传输编码的分工

容易混淆的一点是:Content-Encoding 改的是内容本身,端到端传递;Transfer-Encoding 改的是这一跳怎么把字节搬过去,逐跳生效、每跳自行处理。因此源站与 CDN 之间的编码声明必须一致,而传输编码由每一段连接各自决定。

基本信息

名称Content-Encoding
作用声明表示层编码;接收方需解码
规范RFC 9110 §8.4
常见取值gzip、br、deflate、identity
对比Transfer-Encoding 是逐跳属性,两者不可混为一谈

典型使用场景

  • 文本资源压缩:HTML、CSS、JS、JSON 压一遍通常能省下大半流量
  • CDN 开启 Brotli 后压缩策略改变,源站与边缘的声明必须同步
  • 排查乱码或字节错位:先确认声明值与真实编码是否吻合
  • 抓包分析压缩比与首字节时间:判断瓶颈在压缩还是后端

查看与验证

查看与验证
# 请求时声明可接受的编码,再看响应实际用了哪种
curl -sI -H 'Accept-Encoding: gzip, br' https://www.example.com/ | grep -i content-encoding
# 组合编码按列出顺序施加,解码须逆序:Content-Encoding: gzip, br
curl -s --compressed -o /dev/null -w '%{size_download}\n' https://www.example.com/   # 自动解码后的大小

取值说明

取值说明注意点
gzip兼容性最好的通用压缩对已压缩内容无效,别对图片重复压
brBrotli,同体积下压缩率通常更好浏览器仅在 HTTPS 下接受,动态压缩较耗 CPU
deflate历史遗留取值实现间存在原始 deflate 与 zlib 包装的分歧,易出兼容问题
identity明确表示未编码出现它通常说明压缩被显式关掉了
CDN 改写压缩策略后,源站返回的 Content-Encoding 必须同步改写:声明与实际编码不匹配,客户端按错误算法解码,拿到的就是乱码。
压什么也挑对象:文本类收益显著;图片、音视频、压缩包本身已压缩,再压只耗 CPU,个别情况下体积还会略微变大。

易错点

  • 声明与实际编码不一致(边缘压了但头没改):客户端解出乱码,且只在特定节点复现
  • 对已压缩的图片或压缩包再压:CPU 花掉了,体积几乎不变
  • 压缩与加密顺序搞反(必须先压后加密):加密后的数据无法压缩,带宽白花
  • 对不认识 br 的老客户端强制返回 br:用户侧直接白屏
  • 只给静态资源压缩、忘了 API 的 JSON:大响应体的流量与首字节时间都受影响

数据来源与参考

  • RFC 9110 §8.4 Content-Encoding
  • RFC 9112 §6.1(对比 Transfer-Encoding)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌