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