事情本身不复杂,线索都在日志里。服务器上同时留着 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 与最新文章时间一致,新文章三天内被抓取。
补一句。压缩包和原文件必须同批生成,留一份旧的等于给蜘蛛喂过期数据。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
