你从 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 语法
Vercel — vercel.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
Firebase — firebase.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
每个都应 301 加 Location: 指向真实的新 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 价值。