www.yourdomain.com 能打开。yourdomain.com(apex / 根)显示”无法访问”。或者反过来。输短版的用户碰到错误就走了。修复有两步常被混淆:(1) 两个版本都必须有指向主机的 DNS 记录;(2) 重定向规则把访客统一到 canonical 那个版本。很多人只配了 DNS 或只配了重定向,然后纳闷为什么有一个版本不通。
本文讲两部分以及各平台实现。
常见原因
按命中率从高到低。
1. 只配了一条 DNS 记录
你给 apex 配了 A 但没给 www 配 CNAME。或者反过来。没配的那一边返回 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。定一个。常见选择:
- Apex(
yourdomain.com):更短、更现代。某些平台功能需要。 - www(
www.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.com 和 www.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 一致。