现场是这样的。站点装了静态化插件,文章地址变成 /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、内链要一起改,只改一处必然冲突。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189