这个坑值得记一笔。改版把文章从 /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 变体穷举,斜杠、参数、大小写各是一条,漏一种就留一批死链。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
