现场是这样的。站点装了静态化插件,文章地址变成 /post-1.html,canonical 里却还是 /post-1/,蜘蛛跟 canonical 过去 301 回 .html,判定冲突后整批不收录。
中间走过弯路,把「.html 地址返回 200,原地址 301,规范信号自己打自己」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。静态化规则改了 URL 后缀,canonical 没有同步;插件缓存了旧的 permalink 结构;主题的 rel_canonical 直接输出 get_permalink 的旧值。
上来先确认两种地址的返回码
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.com/post-1/; curl -s -o /dev/null -w "%{http_code}\n" https://www.example.com/post-1.html
canonical 改成实际地址
echo '<link rel="canonical" href="https://www.example.com/post-1.html">';
随后清掉静态化插件的地址缓存
wp cache flush
剩下的就是重新提交并观察规范网址
curl -s "https://www.google.com/ping?sitemap=https://www.example.com/sitemap.xml"
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
这台环境是别人交接的,不少默认值被动过,只能一项项核。
恢复的判定其实很直接。canonical 指向 .html 且该地址直接返回 200,索引里的规范网址与之一致。
容易忽略的是,改 URL 结构时 canonical、sitemap、内链要一起改,只改一处必然冲突。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
