网站换域名时,每个旧 URL 都应单跳到内容对应的新 URL,并保留路径和必要的查询参数。新站的 canonical、站内链接、站点地图、结构化数据和分析配置全部切到新域名;旧域名继续提供有效的 HTTPS 和永久重定向。
迁移前先建立 URL 对照表
从站点地图、访问日志、Search Console、外链和数据库中导出旧 URL,再为每个地址选择一种处理方式:
| 旧 URL 状态 | 处理方式 |
|---|---|
| 内容不变,只换域名 | 保留完整路径并永久重定向 |
| 路径也调整 | 映射到内容最接近的新 URL |
| 多页合并 | 跳到可以继续完成原任务的合并页 |
| 内容永久删除且无替代 | 返回 404 或 410 |
| 静态资源仍被旧页面引用 | 保留资源或映射到同一文件的新地址 |
不要把全部旧 URL 重定向到新首页。用户打开旧文章链接时需要看到对应文章,搜索引擎也依赖这种关系迁移页面信号。
切换旧域名前确认新站可用
新域名必须先满足:
- 正确 DNS 和有效 HTTPS 证书;
- 与旧站一致的核心页面和资源;
- 新域名 canonical、站内链接和结构化数据;
- 只包含新地址的 XML sitemap;
- 新旧域名各自的 Search Console property;
- 分析、广告、OAuth、支付回调、Webhook、CORS 和邮件链接中的新域名配置。
新站尚未完成时,不要先把旧域名全量跳走。用受控预览地址或 Host 映射完成测试,避免两个可索引域名同时长期返回同一内容。
301 和 308 都表示永久迁移
RFC 9110(在新标签页打开)中,301 和 308 都是永久重定向。差别在请求方法:历史兼容行为可能把 301 后的 POST 改为 GET;308 要求后续请求保持原方法和请求体。
- 文章、分类、图片等以 GET/HEAD 为主的公开站点,使用 301;
- API、表单提交或必须保持请求方法的入口,使用 308,并与公开页面迁移规则分开;
- 已选定的迁移状态码保持稳定,不要在 CDN、网关和源站之间形成 301→302→308 链。
如果还要提交 Search Console 的 Change of Address,旧站页面应配置 301。Google 会在提交前抽查旧站页面的 301;308 适合另行迁移必须保留请求方法的非页面入口。
Caddy 保留路径和查询参数的域名迁移可以写成:
new.example.com {
reverse_proxy app:8080
}
old.example.com, www.old.example.com {
redir https://new.example.com{uri} 301
}
{uri} 包含路径和查询部分。旧域名必须继续解析到能完成 TLS 并返回跳转的入口;没有旧证书时,浏览器会先报 HTTPS 错误,根本收不到 301。
新站只声明新地址
新页面头部应输出自身的新 canonical:
<link rel="canonical" href="https://new.example.com/posts/cache-control/">
同步替换:
- 导航、正文和资源中的绝对站内链接;
- Open Graph、Twitter Card 和 RSS 地址;
- JSON-LD 中的 URL、作者和图片地址;
- hreflang 的当前页与互返地址;
- robots.txt 中的 sitemap 地址;
- 邮件模板、应用配置和第三方平台回调。
Canonical 不是重定向的替代品。旧地址仍返回 200,仅把 canonical 指向新站,会让用户继续停留在旧域名,也会延长搜索引擎处理重复页面的时间。
用样本验证单跳和内容对应
从首页、文章、分类、带查询参数页面、404 和静态资源中抽样:
curl -sS -o /dev/null -D - --max-redirs 0 \
'https://old.example.com/posts/cache-control/?from=email'
curl -sS -o /dev/null -w '%{url_effective} %{http_code} %{num_redirects}\n' \
-L 'https://old.example.com/posts/cache-control/?from=email'
第一条应返回一个永久状态和唯一 Location;第二条应只发生一次跳转,并落到对应新页面。继续核对最终页面的标题、canonical、正文和资源,防止“URL 对了,内容却是默认首页”。
把关键路径加入发布检查:
old='https://old.example.com/posts/cache-control/?from=probe'
expected='https://new.example.com/posts/cache-control/?from=probe'
headers="$(mktemp)"
trap 'rm -f "${headers}"' EXIT
curl -sS -o /dev/null -D "${headers}" --max-redirs 0 "${old}"
status="$(awk 'NR == 1 {print $2}' "${headers}")"
location="$(awk 'BEGIN{IGNORECASE=1} /^location:/ {sub(/\r$/, ""); print $2}' "${headers}")"
location_count="$(awk 'BEGIN{IGNORECASE=1} /^location:/ {count++} END {print count + 0}' "${headers}")"
case "${status}" in
301|308) ;;
*) exit 1 ;;
esac
test "${location_count}" -eq 1
test "${location}" = "${expected}"
在 Search Console 提交迁移
Google 的站点迁移文档(在新标签页打开)建议先完成 URL 映射和永久重定向,再提交新站点地图并监测新旧站点。Change of Address 工具(在新标签页打开)适用于从一个域名或子域迁到另一个域名,使用前要验证新旧 property 的所有权,并确认旧站页面已经返回 301。
Change of Address 不能替代重定向,也不适用于只改变少量路径、HTTP 到 HTTPS 或 www 规范化等场景。工具入口和支持范围以提交当天的官方说明为准。
迁移后持续检查抓取、索引、跳转和站内地址
- 旧域名抓取量是否下降,新域名抓取和索引是否上升;
- 旧 URL 是否仍返回 200、临时跳转或多跳;
- 新站 canonical、sitemap 和内部链接是否仍混入旧地址;
- 搜索流量、外链目标、404、证书和跳转服务是否异常。
Google 建议永久重定向通常至少保留一年。仍有外链、书签、邮件或客户端访问的旧地址应继续保留;时间到期不是自动删除跳转的理由。
回滚前要判断新站故障能否直接修复。短时间在新旧域名之间反复切换,会制造新的跳转链、canonical 冲突和索引波动。必须回滚时,恢复完整旧站和旧 canonical,而不是只撤掉一层代理规则。
常见问题
网站换域名应该用 301 还是 308?
普通 GET 网站使用 301;Search Console 的 Change of Address 也按 301 检查旧站页面。必须严格保留 POST 等请求方法和请求体的独立入口使用 308。
旧域名可以全部跳转到新首页吗?
不可以。有效旧 URL 应跳到承接同一内容或任务的新 URL;没有替代内容时返回 404 或 410。
配置重定向后还要改 Canonical 吗?
要。新页面的 canonical、站内链接、结构化数据、hreflang 和 sitemap 都应只使用新域名。
旧域名的证书和服务器可以马上关闭吗?
不可以。客户端先要完成旧域名的 DNS 和 TLS,才能收到重定向。旧 DNS、证书和跳转入口需要长期运行。
域名迁移后多久能删除重定向?
Google 建议通常至少保留一年。只要旧链接仍有实际访问价值,就应继续提供正确跳转。