这个坑值得记一笔。用 PHP 生成的 sitemap 文件开头带了 UTF-8 BOM,浏览器打开完全正常,必应站长工具提交时一直报 XML 解析错误,Google 侧则是已成功但发现 0 条。

刚开始盯着「文件末尾还有多余的空白字符,被当成根节点之外的文本」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。生成脚本的模板文件本身带 BOM,输出时被继承;响应头声明 charset 与文件实际编码不一致;CDN 对 sitemap 做了 HTML 改写,插入了注释。

动手时先检查文件头三个字节

xxd -l 8 sitemap.xml

去掉 BOM 并统一输出编码

sed -i '1s/^\xEF\xBB\xBF//' sitemap.xml

校验 XML 结构

xmllint --noout sitemap.xml

末了按必应 UA 复验一次响应

curl -A 'bingbot' -s https://www.example.com/sitemap.xml | head -c 80 | xxd | head -2

那几天正好在做别的变更,先把时间线对齐才敢动手。

改完先别撤,确认这几项。文件头不再有 BOM,xmllint 校验通过,必应后台显示提交成功,第二天抓取统计里出现 sitemap 的访问记录。

提醒一点。BOM 是最常见的隐形故障点,模板文件、拼接脚本、编辑器保存三处都可能引入,出问题先看文件头。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189