报错是这么冒出来的。改版后文章地址从 /post/标题 slug/ 变成 /p/123,文章之间的互相引用还是老地址,爬了一遍发现三万多条内链要经过一跳 301 才能到,深度也从两层变成四层。

原因不止一个,得分开看。正文内链是发布时手写的绝对路径,没有走文章 ID。少数情况下是301 规则只配了不带日期的旧格式,另一批旧链直接 404。

还有一种情况,站内导航没有同步改成新地址。

先统计需要跳转的内链数量

grep -ro 'href="https://www.example.com/post/[^"]*' posts.html | wc -l

然后按文章 ID 批量重写正文内链

wp db query "UPDATE wp_posts p JOIN wp_postmeta m ON m.post_id=p.ID AND m.meta_key='_old_slug' SET p.post_content=REPLACE(p.post_content, m.meta_value, CONCAT('/p/',p.ID,'/'));"

补齐剩余旧格式的 301

rewrite ^/post/[^/]+/([0-9]+)/?$ /p/$1/ permanent;

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

恢复的判定其实很直接。重写后内链跳转率从七成降到 4%,抓取深度回到两层,日志里 301 的次数减少三分之二。

容易忽略的是,改版换地址时,页面之间的引用比外部链接更值得先处理,那部分是你完全可控的。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189