记录一下那天晚上的排查过程。sitemap.xml 在浏览器里能正常打开,抓取工具却提示内容不是 XML,用 curl 看响应头发现 Content-Type 是 text/html,站点上还套了一层页面模板。

刚开始盯着「文件被重命名成 .xml.html,服务器按后缀判断类型」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。伪静态把 .xml 也交给了 PHP 处理,框架默认输出 HTML 头。少数情况下是CDN 对未知扩展名回落到默认类型,覆盖了源站的设置。

少数情况下是对象存储上传时没指定 Content-Type,默认给了二进制流。

动手时先确认响应头

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

再往下看返回体开头是不是 HTML

curl -s https://www.example.com/sitemap.xml | head -c 200

接着在 Nginx 里固定 XML 的类型

location = /sitemap.xml { default_type application/xml; }

给 CDN 和对象存储补上元数据

aws s3 cp sitemap.xml s3://bucket/ --content-type application/xml

别只看报错消失,验证要多做一步。响应头变成 application/xml,正文首行是 XML 声明,GSC 与百度站长平台都能正常读取。

MIME 类型错了比内容错了更难发现,抓取工具只报一句格式不符,排查时先看头再看体。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189