换域名后重定向全坏了:4 个原因 + 对症修复

从 old.com 迁到 new.com。部分页正确 301,其他 404——如何映射并验证完整的重定向集。

你从 old.com 迁到 new.com。配了 old.com → new.com 的重定向。测了首页——通的。两周后,Search Console 显示新域名上数百个 404、流量下降、外链都打不开。bug:你重定向了,不是 URL 模式old.com/blog/article 跳到 new.com/blog/article,但如果新站这个 URL 不存在(因为你顺便重组了 URL 结构),就 404。每个深 URL 都需要一条映射,而且映射可能不是简单的 1:1。

本文讲怎么建完整 redirect map 并在部署后验证。

常见原因

按命中率从高到低。

1. 只重定向了根,深 URL 没处理

old.com → new.com 重定向了裸根。old.com/blog/article-name 跟随重定向到 new.com/blog/article-name——但新站这个 URL 可能不存在。404。

怎么判断

curl -sI "https://old.com/some-deep-url" | head -3

如果看到 Location: https://new.com/,就是只重定向了根。应该是 Location: https://new.com/some-deep-url

2. URL 结构改了但 redirect map 没跟上

你在迁移时把 /blog/article-name 改成 /articles/article-name。哪怕 URL 完整重定向,也是跳到新域名上的路径。404。

怎么判断:看重定向目标。保留了老路径但新站没老路径,就需要在重定向里加路径改写。

3. 通配符 / 模式重定向无效

你写了模式重定向但平台不支持那个语法。回退成无重定向。

怎么判断:Vercel vercel.json 重定向用 :slug*——确认模式有效。curl 测一下。

4. 托管平台有重定向数量上限

Vercel vercel.json 上限 1024 条重定向。Netlify _redirects 上限更高但有限。超出后多出的静默失效。

怎么判断:数你配置里的重定向数量。> 1024 就有一些被丢了。

5. 旧域名托管完全下线了

如果你彻底关停了 old.com 的托管(不只是 DNS),重定向就发不出去。旧 URL 返回连接拒绝 / 什么都没。

怎么判断curl -I https://old.com/anything 网络错误。需要保留一个只做重定向的托管。

6. HTTPS 旧域名没证书

你配了 HTTP 重定向但 HTTPS 请求 old.com 在重定向之前就证书错误失败。现代浏览器默认 HTTPS。

怎么判断curl -I https://old.com/ 证书错误。curl -I http://old.com/ 通。开了 HSTS 的浏览器到不了 http 版本。

最短修复路径

第 1 步:导出所有旧 URL

来源:

  • old.com/sitemap.xml(如果归档了)
  • Search Console(旧域名仍验证过的话)→ Performance → Pages → 导出
  • 旧托管的服务器日志
  • Wayback Machine 找未收录页面
  • 外链数据(Ahrefs、Majestic、GSC links 报告)

第 2 步:建 redirect map

每个旧 URL 决定:

  • 有直接对应old.com/blog/foo → new.com/articles/foo
  • 没精确对应:重定向到最近分类——old.com/topic-x/* → new.com/category/x/
  • 真孤儿:兜底重定向到首页

CSV 格式:

old_path,new_path
/blog/article-name,/articles/article-name
/topics/ai,/category/ai
/old-broken-page,/

第 3 步:转成平台的 redirect 语法

Vercelvercel.json

{
  "redirects": [
    { "source": "/blog/:slug", "destination": "https://new.com/articles/:slug", "permanent": true },
    { "source": "/topics/:topic", "destination": "https://new.com/category/:topic", "permanent": true },
    { "source": "/:path*", "destination": "https://new.com/:path*", "permanent": true }
  ]
}

顺序重要——具体模式在 catchall 之前。

Netlify_redirects

/blog/*    /articles/:splat    301
/topics/*  /category/:splat    301
/*         /:splat             301

Firebasefirebase.json

{
  "hosting": {
    "redirects": [
      { "source": "/blog/:slug", "destination": "https://new.com/articles/:slug", "type": 301 }
    ]
  }
}

第 4 步:在域名的托管上部署重定向

让 old.com 的托管一直跑、只有重定向规则。不用整个 app——只重定向部署就够。Vercel/Netlify 都能 host 一个只有 redirect 配置的”静态站”。

确保旧域名仍 DNS 指向这个重定向主机且有有效 SSL 证书。

第 5 步:用 curl 验证

随机抽 50 个旧 URL 测:

for url in $(head -50 old_urls.txt); do
  result=$(curl -sI "$url" | head -1)
  location=$(curl -sI "$url" | grep -i location | head -1)
  echo "$url$result $location"
done

每个都应 301Location: 指向真实的新 URL。

第 6 步:Search Console 提交 Change of Address

旧域名在 Search Console 里已验证 → Settings → Change of address → 声明迁移到新域名。帮 Google 理解迁移。

第 7 步:重定向永远留着

一年后不要撤。外链可能持续多年。无限期保留只重定向的部署。

哪些情况可能不是你操作错了

托管平台 redirect 语法不同:Vercel vercel.json、Firebase firebase.json、Netlify _redirects。用对你平台的语法;从其它平台复制可能静默失败。

容易误判的情况

以为 Google “自己会”。没显式 301,链接权重就永久丢失。Google 不会old.com/foo 等于 new.com/foo 当 URL 结构变了的时候。

预防建议

  • 新域名上线先做 redirect map,不要作为后清理。
  • Redirect 规则进版本控制(vercel.json_redirects 等)。
  • 老域名的重定向部署无限期保留,永远别撤。
  • 部署后用 curl 抽测 50+ 条重定向。
  • 大站规划时用通配符策略,留在平台限制以内。

FAQ

  • 重定向保留多久? 永远。SEO 权重最少 12 个月,外链考虑无限期。
  • 永久迁移能用 302 吗? 不能——用 301。302 不传 SEO 价值。

相关阅读

标签: #域名 #DNS #SSL #排查 #重定向