这类问题我又碰上了一次。sitemap 索引文件里四个子文件的 lastmod 都写着 1970-01-01T00:00:00+00:00,蜘蛛每天只抓一个子文件,新文章一周才轮到。

第一反应是「索引文件用手工模板维护,lastmod 从来没有被真正写入」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。时间戳字段是 int 类型,空值被格式化成 0 再转成日期;生成脚本取的是文件创建时间,容器里文件系统时间被重置过;子文件按时间排序,索引里顺序和实际更新时间对不上。

上来先查看索引文件里的时间字段

curl -s https://www.example.com/sitemap_index.xml | grep -o '<lastmod>[^<]*'

随后按文件修改时间重新生成索引

find . -name 'sitemap_*.xml' -printf '%TFT%TH:%TM:%TS %p\n' | sort -r

剩下的就是改成取子文件里最大的 lastmod

grep -o '<lastmod>[^<]*' sitemap_post.xml | sort | tail -1

恢复的判定其实很直接。索引文件重新生成后时间戳回到真实日期,四个子文件在两天内被依次抓取,新文章的收录间隔缩短到一天。

索引层的 lastmod 决定蜘蛛先读哪一份,写错比不写更糟,容易让整批子文件长期排在队尾。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189