报错是这么冒出来的。WordPress 装在根目录,https://www.example.com/index.php/about/ 和 /about/ 都能正常返回 200,日志里两套地址各占一半,GSC 把带 index.php 的那套当成了规范页。
真正麻烦的地方在于,几个原因的现象几乎一样。Nginx 的 try_files 先匹配 index.php,直接访问时也命中同一条规则。另一种情况是页面里的链接有一部分是插件用 home_url 拼出来的,带了 index.php。
另外,canonical 输出的是当前 REQUEST_URI,哪套进来就写哪套。
动手时先确认两套地址返回的状态与 canonical
curl -s https://www.example.com/index.php/about/ | grep -i canonical
接着加一条固定跳转把入口收敛
if ($request_uri ~ ^/index\.php) { rewrite ^/index\.php(.*)$ $1 permanent; }
末了把 canonical 固定成不带入口的地址
add_filter('wp_get_canonical_url', fn($u) => str_replace('/index.php', '', $u));
命令输出我都留了记录,免得改完记不清原来的值。
改之前先确认了最近有没有人动过配置,避免白查一遍。
恢复的判定其实很直接。带 index.php 的请求在日志里全部返回 301,canonical 统一指向干净地址,重复网页报表里该组只剩一条。
提醒一点。改完要清一次页面缓存,否则旧 HTML 里的 canonical 还会带着 index.php 继续被抓。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
