这个坑值得记一笔。站点地图挂在同机 8080 端口,Search Console 提交 http://203.0.113.10:8080/sitemap.xml 后一直提示 Couldn't fetch,浏览器打开返回 200,内容确实是 XML。

刚开始盯着「CDN 对 .xml 只给浏览器 UA 放行,Googlebot 请求返回 403」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。平台只接受与资源同主机同协议的地址,IP 加端口的方式在读取阶段就被拒;文件响应头是 application/octet-stream,被判成附件而不是 XML;文件开头多了 UTF-8 BOM,解析在第一行就中断。

第一件事是确认蜘蛛 UA 拿到的状态码和响应头

curl -sI -A 'Googlebot' http://203.0.113.10:8080/sitemap.xml

接着改回同域名同协议的地址再提交

https://www.example.com/sitemap_index.xml

修正 XML 的 MIME 类型

location ~ \.xml$ { default_type application/xml; }

去掉 BOM 后重新生成

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

别只看报错消失,验证要多做一步。重新提交后状态在一小时内变成成功,已发现条数和文件条数一致,响应头里的类型是 application/xml。

提醒一点。站点地图地址必须落在资源目录下,跨主机或带非标准端口时连读取都不会发生,报错文案却只写抓取失败。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189