事情本身不复杂,线索都在日志里。服务器上同时留着 sitemap.xml 和 sitemap.xml.gz,Nginx 1.24 的 gzip_static 优先返回压缩包,内容还是上个月的,新文章一直没被抓。

第一反应是「提交的地址被 CDN 缓存,边缘返回旧压缩包」,验证下来不成立。

真正麻烦的地方在于,几个原因的现象几乎一样。gzip_static 命中旧压缩包,原文件更新后压缩包没重生成。少数情况下是生成脚本只写 .xml,压缩包靠定时任务补,中间存在空窗口。

还有一种情况,两份文件的 lastmod 不一致,蜘蛛选了更旧的那份。

上来先看线上返回的是哪一份

curl -sI https://www.example.com/sitemap.xml | Select-String "Content-Encoding|Last-Modified"

生成时同时刷新压缩包

gzip -9 -c sitemap.xml > sitemap.xml.gz

接着让 Nginx 优先读原文件

gzip_static off;

等前面都确认过,再清掉 CDN 上的旧副本

curl -X PURGE https://www.example.com/sitemap.xml

恢复的判定其实很直接。线上 sitemap 的 Last-Modified 与最新文章时间一致,新文章三天内被抓取。

补一句。压缩包和原文件必须同批生成,留一份旧的等于给蜘蛛喂过期数据。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189