报错是这么冒出来的。图片迁到对象存储后,sitemap 仍从源站读取,CDN 缓存了一份旧版本,新发布的文章一直没进 sitemap,前端却显示正常。
原因不止一个,得分开看。CDN 把 xml 当成静态资源长期缓存,默认按三十天处理。另一种情况是回源规则只配了图片目录,sitemap 走了错误的源。
还有一种情况,对象存储里也有一份同名 sitemap,内容更旧。
先检查 CDN 返回的是哪一份文件
curl -sI https://www.example.com/sitemap.xml | grep -i age
给 xml 设置不缓存或短缓存
location ~ \.xml$ { add_header Cache-Control 'max-age=300'; }
强制刷新 CDN 上的 sitemap 缓存
curl -X PURGE https://www.example.com/sitemap.xml
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
别只看报错消失,验证要多做一步。响应头里的缓存时间变短,新发布的文章当天就能在 sitemap 里看到,GSC 读取条数同步增长。
这里还有个坑。xml 和 html 的缓存策略要分开配,按静态资源统一缓存一个月,收录速度会被拖慢非常多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。