Nginx 1.24 装了 brotli 模块,br 压缩开在 6 级,日志里蜘蛛请求带 Accept-Encoding: gzip, deflate, br,抓到的内容被解成乱码,GSC 里正文识别成一片符号。

排查方向其实有限,先把可能性排一排。brotli_types 里误加了 text/html 但动态模块未加载完整,输出被截断;压缩和 proxy_cache 同时开,缓存里存的是压缩流,长度头按未压缩计算;上游已经 gzip 一次,Nginx 又压一次形成双层编码。

指定 br 头看实际返回长度

curl -sI -H "Accept-Encoding: br" https://www.example.com/ | grep -iE "content-encoding|content-length"

只保留 gzip 并清缓存

gzip on; gzip_types text/html text/css application/javascript; brotli off;

从压缩流解出正文做一次校验

curl -s --compressed https://www.example.com/ | head -c 200

当时还开着另一个排查窗口,两边日志对照着看才定位到。

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

改完先别撤,确认这几项。带 br 的响应回落到 gzip 或未压缩,解压后前 200 字节是正常 HTML,抓取统计里首页下载大小与源站一致。

动态模块要确认 load_module 路径正确,加载失败时配置不报错,只是压缩悄悄失效或输出异常。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189