问题出现得很突然,日志倒是留得挺全。为了让人看得懂,给 sitemap 套了 xsl 样式表,浏览器打开是表格,用 curl 拿到的前几行却是 HTML 的 div 结构。

把日志和配置对完,能解释这个现象的基本就这几处。服务端按 Accept 头做了内容协商,返回了渲染结果。还有一种是xsl 引用写成 302 跳转,蜘蛛跟到了样式页。

不容易想到的是,XML 声明前多了空行和 BOM,解析直接失败。

动手时先用纯文本方式取原始响应

curl -s -H 'Accept: application/xml' https://www.example.com/sitemap.xml | head -3

去掉样式表引用只留数据

curl -s https://www.example.com/sitemap.xml | grep -c '<?xml-stylesheet'

校验 XML 能否解析

xmllint --noout https://www.example.com/sitemap.xml

末了确认响应类型

curl -sI https://www.example.com/sitemap.xml | grep -i content-type

这台环境是别人交接的,不少默认值被动过,只能一项项核。

怎么算真的好了,看的是同一批现象。原始响应首行是 XML 声明,校验工具无报错,GSC 重新读取后状态成功且地址数正确。

这里还有个坑。样式表本身无害,前提是只在浏览器里生效,服务端不能因为 Accept 头改变输出。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189