事情本身不复杂,线索都在日志里。站点每小时生成一次 sitemap_index.xml.gz,源站已经包含当天新文。CDN 按 .gz 后缀给了 12 小时缓存,蜘蛛在 GSC 里读到的还是前一天的版本,新文两天都没被发现。

第一反应是「sitemap 的 URL 固定不变,边缘节点没有失效信号」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。缓存规则按静态资源后缀匹配,.gz 被当成图片一样长缓存。也可能是源站没有返回 Cache-Control,CDN 走了默认 TTL。

不容易想到的是,生成脚本直接覆盖同名对象 边缘拿不到版本变化的信号。

上来先看边缘节点返回的缓存头

curl -sI https://www.example.com/sitemap_index.xml.gz | grep -iE 'age|cache-control|x-cache'

给 sitemap 单独设短缓存

location ~* sitemap.*\.gz$ { add_header Cache-Control 'public, max-age=600'; }

接着在生成后主动刷新边缘缓存

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

等前面都确认过,再确认蜘蛛拿到的是最新版本

curl -s https://www.example.com/sitemap_index.xml.gz --compressed | grep -c '<loc>'

恢复的判定其实很直接。把 TTL 压到十分钟并加上生成后刷新,第二天 GSC 里 sitemap 的最后读取时间就跟上了,新文当天下午被收录。

补一句。sitemap 属于动态内容,别让它落在静态资源的缓存规则里,后缀匹配的通配写法最容易出这个问题。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189