这个坑值得记一笔。改版把文章从 /blog/ 目录搬到根目录,首页和栏目都写了 301,文章页只写了不带斜杠的规则,带斜杠的旧链接全部落到 404。

刚开始盯着「CDN 缓存了旧的 301,新规则上线后仍是旧跳转」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。规则只匹配 /blog/xxx 没考虑结尾斜杠的变体;分页和带参数地址没有列进规则,散落在日志里;内链没有批量替换,蜘蛛从正文又爬回旧地址。

上来先抽查几种旧地址变体

for u in /blog/a/ /blog/a /blog/a?x=1; do curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' https://www.example.com$u; done

再往下统计仍返回 404 的旧地址

awk '$9==404 {print $7}' access.log | grep '^/blog/' | head -20

接着用一条正则覆盖斜杠与参数

rewrite ^/blog/(.+?)/?$ https://www.example.com/$1 permanent;

批量替换正文里的旧目录

UPDATE wp_posts SET post_content=REPLACE(post_content,'/blog/','/') WHERE post_type='post';

改完先别撤,确认这几项。旧地址的几种变体全部一次跳到新地址,日志里 /blog/ 的 404 归零,新目录的抓取量稳步上升。

301 规则要按 URL 变体穷举,斜杠、参数、大小写各是一条,漏一种就留一批死链。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189