博客上线那天,我给自己倒了杯咖啡,准备欣赏一下成果:opusmia.com 打开,完美;www.opusmia.com 打开——跳到了一个完全陌生的页面。咖啡差点喷在键盘上。我的第一反应是:证书又坏了?Nginx 配置写劈叉了?查了一圈,最后发现问题根本不在服务器上,在 Cloudflare 的 DNS 里:www 的 CNAME 指到了别处,一个我早忘了的旧地址。

那天下午我没写成博客,全用来给自己扫盲 DNS 了。下面是这个坑的完整经过。

现象:主域名好好的,www 去了别人家

先说症状。opusmia.com 一切正常,HTTPS 小锁头端端正正。但 www.opusmia.com 打开,要么转半天打不开,要么跳到一个跟我毫无关系的页面。我当时脑子里闪过的第一个念头是证书问题——毕竟前两天刚折腾完 certbot,惊弓之鸟。

但冷静下来想想:证书是按域名签的,www 的问题如果出在证书上,浏览器应该报证书错误,而不是"去了别人家"。去了别人家,说明解析就错了,流量根本没到我的 VPS。

排查:dig 是个好东西

我 SSH 上服务器,直接问 DNS:

dig www.opusmia.com +short
dig opusmia.com +short

主域名返回了我的 VPS 地址(意料之中),www 返回的却是一个陌生的地址,还带了一串 CNAME。看到 CNAME 那一刻我就明白了:www 被一条 CNAME 记录指到了别处。

登录 Cloudflare 后台一看,果然:www 下面躺着一条 CNAME,指向一个我早期瞎折腾时填的旧地址。再往下一翻,更精彩——同一主机名 www 下面,还躺着一条 A 记录。CNAME 和 A 记录在同一个主机名上共存,Cloudflare 虽然没报错,但解析结果完全不可预期。这就好比给 HOA 交了两份地址变更表,一份说我住 A 街,一份说我住 B 街,邮递员只能凭心情送信。

根因:早期瞎折腾留下的烂摊子

这条 CNAME 是我刚买域名那会儿留下的。当时还没想好博客放哪儿,随手把 www 指到了一个临时地方。后来决定自建博客,主域名的 A 记录改到了 VPS,www 的这条旧 CNAME 却被我忘得一干二净。

它还连带坑了我一把:之前用 certbot 申请证书时,我把 -d www.opusmia.com 也写进去了,HTTP 验证走的就是这条错的解析,第一次申请 www 的验证没通过。当时我以为是 Cloudflare 小黄云的问题,切灰云重跑才过——现在回头看,八成是这条 CNAME 在捣乱。DNS 的坑,都是连环坑。

修复:删掉 CNAME,A 记录指回自己家

修复很简单,分两步:

  1. 在 Cloudflare 后台删掉 www 那条旧的 CNAME 记录。
  2. 给 www 加一条 A 记录,指向我的 VPS(和主域名同一个地址)。

改完等几分钟,用 dig 验证:

dig www.opusmia.com +short

返回的地址和主域名一致,世界和平。浏览器再打开 www.opusmia.com,小锁头,内容,一样不少。

有人会问:为什么不用 CNAME 把 www 指回 opusmia.com?可以,www CNAME 到 @(主域名)是常见做法。但我的习惯是:博客这种核心资产,www 直接 A 记录指 IP,少一层跳转,排查问题时少一个变量。CNAME 适合指那些"跟着主域名走"的附属服务,理解了这个,就不会乱指了。

教训:DNS 改动前先截图

这次踩坑,最大的教训不是技术,是习惯:

  1. 改 DNS 前先截图。Cloudflare 后台的 DNS 列表,改之前截个图存着。出问题时对比一下,旧记录一目了然。我当时要是有截图,十分钟就能定位,不用折腾一下午。
  2. 一个主机名只留一种记录。www 要么 A 记录,要么 CNAME,别两种都留。Cloudflare 不拦你,但解析结果会教你做人。
  3. 域名刚买回来时的"临时记录"最危险。当时随手填的,过两个月全忘光。凡是临时记录,要么当时就删,要么在备忘录里记一笔。

DNS 这东西,平时感觉不到它,出问题时全是它。就像家里的水管:不爆的时候你都忘了它存在。

一句话总结

www 打不开先别怀疑服务器和证书,dig www.你的域名 +short 看一眼解析去哪儿了。八成是 DNS 记录里躺着一条你忘了的旧 CNAME。删掉它,A 记录指回自己的 VPS,改前截图,改后 dig 验证。