记录一下那天晚上的排查过程。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 类型错了比内容错了更难发现,抓取工具只报一句格式不符,排查时先看头再看体。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
