生成的sitemap.xml看似完整,但URL超过协议上限后,搜索引擎只处理一部分。单个Sitemap最多50000个URL且未压缩文件不应超过50MB,商品多时必须拆分并提供Sitemap Index。

现象

我保留了一个失败样本,并用同样输入在无缓存或单节点条件下再跑一遍。这样可以把前端假象、缓存和真正的数据问题分开。

排除法

  • 统计实际数量和文件字节,不要以后台“生成成功”为准。
  • 检查robots.txt和Search Console提交的是索引文件还是某个分片。
grep -c "<url>" pub/sitemap.xml
wc -c pub/sitemap.xml
xmllint --noout pub/sitemap.xml
curl -I https://shop.example.com/sitemap.xml

这里的重点不是把报错暂时消掉,而是让同一操作再执行一次仍保持幂等;因此修复后一定要做第二次重复执行测试。

最终处理

启用支持分片的生成逻辑,按产品、分类或每49900条切成多个sitemap-*.xml.gz,再生成只包含的index。多Store分别使用自身域名和URL,定时生成后原子替换文件,避免爬虫读到半写文件。

修改范围

  • 先在单个SKU、单个订单或单个Store验证。
  • 保留可回退的旧配置,不覆盖原始证据。
  • 需要批量处理时分批提交并输出成功/失败清单。

检查收尾

  • 每个分片URL数和大小都低于限制
  • 索引中的loc均可200访问
  • URL域名与所属Store一致
  • Search Console重新抓取无解析错误

验收不只看后台提示“成功”。我还会从前台/API再走一次真实链路,并在下一轮cron、索引或缓存命中后重复检查,确认不是短暂正常。

经验

Sitemap Index本身使用sitemapindex根节点,不能把URL条目直接混在其中。