www 与根域名不一致(都该通):3 个原因 + 修复路径

www.example.com 通但 example.com 不通(或反)。常见原因:(根的 A 和 www 的 CNAME)只配了一个;主机平台期望特定配置;两者间无重定向规则。先做:选 canonical:根 or www。定一个。

www.yourdomain.com 能打开。yourdomain.com(apex / 根)显示”无法访问”。或者反过来。输短版的用户碰到错误就走了。修复有两步常被混淆:(1) 两个版本都必须有指向主机的 DNS 记录;(2) 重定向规则把访客统一到 canonical 那个版本。很多人只配了 DNS 或只配了重定向,然后纳闷为什么有一个版本不通。

本文讲两部分以及各平台实现。

常见原因

按命中率从高到低。

1. 只配了一条 DNS 记录

你给 apex 配了 A 但没给 wwwCNAME。或者反过来。没配的那一边返回 NXDOMAIN。

怎么判断

dig yourdomain.com +short
dig www.yourdomain.com +short

其中一个为空就是缺记录。

2. 两个 DNS 都配了但没重定向

两边都解析、都加载站,但各自独立提供内容。SEO 把它当重复内容,用户看到 URL 不一致。

怎么判断

curl -sI https://yourdomain.com | head -3
curl -sI https://www.yourdomain.com | head -3

两边都返回 200(不是 301 到另一个)就是缺重定向。

3. apex 用了 CNAME(违反 RFC)

你在 apex(根域名)上设了 CNAME。严格 DNS 提供商拒绝;宽松的接受但会有隐蔽 bug(MX 记录不工作、跟 TXT 冲突)。

怎么判断:DNS 提供商错误如 “CNAME cannot coexist with other records at apex”。或者只是静默部分失败。

4. 主机平台要求特定的 apex / www 约定

Vercel apex 必须 A 76.76.21.21。Netlify 类似。配了一个主机的 apex IP 但实际服务在另一个,就错配。

怎么判断:对比你的 A 记录 IP 跟平台文档的 apex IP。

5. 重定向写在了应用代码里、不在平台层

你在 app 代码(如 React Router)里加了重定向。但它只在页面加载后触发。SEO 和直接命中仍看到错误 canonical。

怎么判断:重定向在 JS 加载后才发生,不是初始响应的 301。应该在平台层做 HTTP 301。

6. www 子域没在主机上配

你把 yourdomain.com 加到了 Vercel 但 www.yourdomain.com 没加。CNAME 指了但主机返回 404。

怎么判断:平台控制台 → 域名列表。只有一个就把另一个加上。

最短修复路径

第 1 步:选 canonical

要么 apex 要么 www。定一个。常见选择:

  • Apexyourdomain.com):更短、更现代。某些平台功能需要。
  • wwwwww.yourdomain.com):传统、跟 CDN 配合更好(www 上的 CNAME 避免 apex CNAME 问题)。

把选择写在显眼地方,免得回头自己又纠结。

第 2 步:两个 DNS 记录都配

Vercel + apex 作为 canonical:

A    @     76.76.21.21
CNAME  www   cname.vercel-dns.com

Vercel + www 作为 canonical:

CNAME  www   cname.vercel-dns.com
A    @     76.76.21.21    (仍需要,给重定向用)

不管选哪个 canonical,两个都要存在。

第 3 步:两个域名都加到主机

Vercel / Netlify / Firebase 控制台里把 yourdomain.comwww.yourdomain.com 都加。平台才知道处理两个。

很多平台两个都加后会自动重定向非 canonical → canonical。其它的需要显式配。

第 4 步:在平台层配重定向

Vercel — 域名设置 → 设一个为 primary;Vercel 自动重定向另一个。

Netlify — 域名管理 → 设 primary;同样自动重定向。

Firebase — 两个域名都能加,但重定向要写在 firebase.json

{
  "hosting": {
    "redirects": [{
      "source": "**",
      "destination": "https://yourdomain.com/:1",
      "type": 301
    }]
  }
}

(按域名配的具体形式有差异;这是大意。)

第 5 步:验证

# 非 canonical 应 301 到 canonical
curl -sI https://www.yourdomain.com | head -5
# 预期:HTTP/2 301, Location: https://yourdomain.com/

两个都返回 200 就是没配重定向。

第 6 步:<head> 和 JSON-LD 的 canonical 也对齐

即使有重定向,HTML 也应自指 canonical:

<link rel="canonical" href="https://yourdomain.com/article/" />

不是 https://www.yourdomain.com/article/。匹配你选的 canonical。

预防建议

  • 上线就选 canonical——别后改(会引发 Search Console 大量变动)。
  • 第 1 天就两个 DNS 都配(apex A 和 www CNAME)。
  • 立刻把两个域名都加到主机。
  • 用 curl 验证重定向返回 301,不只是 JS 重定向。
  • HTML 里的 self-canonical 跟你选的 canonical 一致。

相关阅读

标签: #排查 #DNS #排查