sitemap 由脚本生成 .gz 文件,nginx 又对 .gz 做了一次 gzip 压缩。用浏览器访问正常,GSC 里 sitemap 状态一直停在无法读取,日志里蜘蛛拿到的长度是 24 字节。
一开始怀疑是「本地用 curl 没带 Accept-Encoding,看到的反而是正常的单层内容」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。脚本已经压缩过,服务端对 .gz 再次压缩形成双层编码。还有一种是Content-Encoding 只声明了一层,解压后仍是压缩数据。
还有一种情况,生成脚本对已经是 gz 的流又套了一层压缩。
带压缩头看真实返回
curl -s -H 'Accept-Encoding: gzip' -o out.gz https://www.example.com/sitemap.xml.gz && ls -l out.gz
再往下关掉对 .gz 的二次压缩
location ~* \.gz$ { gzip off; add_header Content-Type application/x-gzip; }
解压验证内容可读
gunzip -c out.gz | head -3
末了重新提交 sitemap 看 discovered 数量
gunzip -c out.gz | grep -c '<loc>'
恢复的判定其实很直接。关掉二次压缩后蜘蛛拿到的文件能正常解出 XML,sitemap 状态当天变成成功,发现的 URL 数量回到 2.6 万条。
容易忽略的是,静态压缩文件要显式关掉服务端压缩,并固定 Content-Type,否则不同客户端看到的解码结果会完全不一样。这类问题最好一次改到位,反复小改反而容易把原因搅混。
