网站换域名时,每个旧 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 对了,内容却是默认首页”。

从旧 URL 抽样检查永久状态码、唯一 Location、单跳、最终 200 和新 canonical 的验证流程
除状态码外,还要确认最终内容和 canonical 与旧页面对应。

把关键路径加入发布检查:

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 建议通常至少保留一年。只要旧链接仍有实际访问价值,就应继续提供正确跳转。