WordPress 6.6 从 blog.old.com 迁到 www.new.com Nginx 1.24 上只按 ID 写了文章规则 rewrite ^/archives/(\d+)$ /p/$1 permanent 文章页正常 但 /category/seo/ 和 /tag/nginx/ 这类归档地址全部 404 站长后台一周报了 6000 条死链 重新提交 sitemap 也没变化

一开始怀疑是「归档模板在新站被主题关掉 即使跳过去也是 404」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。301 规则只匹配了 /archives/ 数字路径 分类和标签前缀完全没写。还有一种是旧站分类 base 是 /cat/ 新站是 /category/ 两边目录名不一样。

另外,旧域 DNS 还指向新机器 robots 没封 蜘蛛继续抓旧地址。

先把旧站日志里的归档前缀全部导出来

grep -o '/category/[a-z0-9-]*' access.log | sort -u > cat.txt

再往下按前缀补分类和标签的 301 规则

rewrite ^/category/(.*)$ https://www.new.com/category/$1 permanent;

随后确认新站归档模板确实开着

wp option get category_base

剩下的就是抽十条旧归档地址验返回码

curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' https://blog.old.com/category/seo/

改完先别撤,确认这几项。抽样的二十条归档地址全部 301 落到对应新分类页 死链数一周内不再新增 旧域日志里归档请求占比降到个位数。

容易忽略的是,迁移前先把旧站 URL 前缀统计一遍再写规则 比事后一条条补要从容得多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189