先把当时的情况摆出来。WordPress 换固定链接后加了一条 RewriteRule,把所有不以 /wp- 开头的请求重写到 index.php。sitemap.xml 也被卷进去,返回的是 HTML 首页,GSC 报无法读取站点地图。
真正麻烦的地方在于,几个原因的现象几乎一样。重写规则没有排除 .xml 后缀,文件请求被交给 PHP 处理。另一种情况是规则写在 WordPress 主块之前,顺序正好反了。
另外,Nginx 只用 try_files 兜底,没给 sitemap 单独 location。少数情况下是CDN 把 HTML 内容按 .xml 缓存,改回来还返回旧内容。
动手时先看返回的真实内容类型
curl -sI https://www.example.com/sitemap.xml | grep -i content-type
再往下在重写规则前放行静态文件
RewriteCond %{REQUEST_URI} !\.(xml|txt)$
给 sitemap 单独一个 location
location = /sitemap.xml { try_files /sitemap.xml =404; }
剩下的就是清掉 CDN 后再重新提交
curl -X PURGE https://www.example.com/sitemap.xml
这类改动我都写进变更记录,过两周再出问题时能对上号。
别只看报错消失,验证要多做一步。请求返回 application/xml,内容第一行是 xml 声明,GSC 状态恢复成功。
这里还有个坑。伪静态规则要优先放行 robots、sitemap 和验证文件,否则它们会最先被首页模板吃掉。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
