提交给百度站长平台的 sitemap 一直提示格式错误,文件在 GSC 里能正常读取,打开看根标签是 urlset,里面却塞了多个子 sitemap 的地址。
一开始怀疑是「文件编码是 UTF-8 带 BOM,首行解析失败」,查了一圈,方向不对。
原因不止一个,得分开看。索引文件必须用 sitemapindex 根标签,混用会被判格式错。另一种情况是子文件的命名空间少写了 xmlns 声明。
另外,子 sitemap 的地址写成了相对路径。
上来先看根标签和命名空间
curl -s https://www.example.com/sitemap_index.xml | head -5
然后确认子文件地址是绝对路径
curl -s https://www.example.com/sitemap_index.xml | grep -o '<loc>[^<]*' | head
再往下按索引格式重写根节点
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
去掉 BOM 后再提交
sed -i '1s/^\xEF\xBB\xBF//' sitemap_index.xml
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。百度站长平台重新抓取后状态变为成功,子 sitemap 的条数逐条显示出来。
索引文件和普通 sitemap 是两套结构,根标签一错整份文件就废,提交前先看第一行。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
