问题出现得很突然,日志倒是留得挺全。后台复制出来的预览地址是 /?p=123 的形式,被几个外部站点转走之后,搜索里同时出现短链和固定链接两个版本。

刚开始盯着「分享时直接复制了地址栏里的短链」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。?p= 是 WordPress 的原始地址,改动固定链接后依然可用。少数情况下是短链没有 canonical,蜘蛛把它当成独立页面。

少数情况下是站内的一些老链接仍然指向 ?p= 形式。

先确认短链返回的状态和 canonical

curl -sI https://www.example.com/?p=123 | head -3

随后让短链 301 到固定链接

add_action('template_redirect', function(){ if (isset($_GET['p']) && !is_admin()) wp_redirect(get_permalink((int)$_GET['p']), 301); exit; });

批量查站内残留的短链

wp db query "SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%?p=%' LIMIT 20;"

复查跳转是否生效

curl -sI https://www.example.com/?p=123 | grep -i location

别只看报错消失,验证要多做一步。短链返回 301 并带 Location 到固定链接,site 查询里 ?p= 的条目两周内消失,收录版本只剩一个。

补一句。直接封掉 ?p= 会打断预览和部分插件,做 301 比做屏蔽安全,权重也能顺着跳转合并过来。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189