Accept-Encoding
用法
HTTP Accept-Encoding 请求头是内容协商过程的一部分,用于指定客户端支持哪些编码方法。服务器会选择其中一种可用的方法,然后通过在 HTTP 响应中包含 Content-Encoding 头来告知客户端所做的选择。
注意
在某些情况下,即使客户端和服务器支持相同的编码方法,也不会在发送前对原始资源进行任何处理。这发生在资源的 identity 值同样可接受的情形下。一个常见的例子是数据已经过压缩,再应用一次压缩算法也不会进一步减小体积,这在预压缩的图片文件(例如 JPEG)上就会出现。另一种情形是服务器负载过高,无法腾出传输前处理数据所需的资源。
指定多种编码可以使用多个 HTTP Accept-Encoding 头,也可以使用逗号分隔的列表。同时可以包含 q 因子来表示偏好或优先级。
对 SEO 的影响
Google 的爬虫和抓取器支持 gzip、deflate 和 Brotli(br)内容编码。每个 Google 用户代理都会在每个请求的 Accept-Encoding 头中声明所支持的编码,通常为 Accept-Encoding: gzip, deflate, br。向 Googlebot 提供压缩响应可减少带宽和抓取时间。Bingbot 发送 Accept-Encoding: gzip, deflate。
gzip
gzip 指令表示客户端支持 GNU zip 压缩。这是 Web 上支持最广泛的编码。
deflate
deflate 指令表示客户端支持 zlib 压缩。尽管名称如此,它实际上是在原始 DEFLATE 压缩数据外包裹了一层 zlib。
br
br 指令表示客户端支持 Brotli 压缩。对于基于文本的内容,Brotli 通常能获得比 gzip 更好的压缩比。
zstd
zstd 指令表示客户端支持 Zstandard 压缩。Zstandard 在提供高压缩比的同时具有快速的解压速度。
identity
identity 指令表示不应用任何编码。除非通过 identity;q=0 显式排除,否则该值始终被视为可接受。
*(通配符)
- 通配符匹配任意未在头中列出的编码。如果没有 Accept-Encoding 头,服务器会将请求视为指定了 *。
;q=(质量值)
;q= 参数为每种编码分配一个介于 0 和 1 之间的权重,其中 1 为最高优先级,0 表示”不可接受”。省略时默认质量值为 1。服务器使用这些权重来选择偏好的编码。
示例
在这个例子中,客户端请求服务器使用几种编码方法之一。在第一种变体中,每个选项被赋予相同的优先级。在第二种变体中,使用 q 值指令为编码优先级分配权重。服务器以所应用编码的列表作为响应,并按处理顺序排列。
请求(变体 #1)
GET / HTTP/1.1
Host: example.com
Accept-Encoding: gzip
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
请求(变体 #2)
GET / HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate, br;q=1.0, identity;q=0.5, *;q=0.25
响应
HTTP/1.1 200 OK
Content-Encoding: gzip, br
故障排查
尽管有 Accept-Encoding 却未应用压缩。某些反向代理会在转发前从请求中剥离 Accept-Encoding。在 nginx 中,proxy_set_header Accept-Encoding $http_accept_encoding 可保留原始值。可用 curl -H “Accept-Encoding: gzip” -I 进行验证。
选择了意外的编码。质量值(q 因子)控制偏好顺序。带有 Accept-Encoding: gzip;q=0.5, br;q=1.0 的请求会偏好 Brotli。省略 q 值意味着赋予相同权重,服务器可自由选择。
CORS 预检缺少 Accept-Encoding。Accept-Encoding 头在 CORS 中属于安全列表,不会触发预检。如果压缩在跨源请求上停止工作,请检查服务器是否在不考虑 Origin 头的情况下应用压缩。
CDN 提供未压缩的响应。某些 CDN 仅在源站发送带有适当 Content-Type 的未压缩响应时才进行压缩。请确认源站以 Vary: Accept-Encoding 响应,以便 CDN 分别缓存压缩和未压缩的变体。
identity 编码被拒绝。发送 Accept-Encoding: identity;q=0 告诉服务器客户端无法接受未压缩的响应。如果没有可用的受支持编码,服务器会返回 406 Not Acceptable。除非能保证所列出的所有编码都可用,否则应避免将 identity 设为 q=0。