你昨天把域名连到新主机。刷新——站打开。再刷新——主机的 Domain not configured / Invalid Configuration 页,或者注册商的停放页(parking page)。再刷新——又通了。朋友在另一个 ISP 完全打不开;另一个说没问题。这就是典型的半过渡 DNS 状态:部分 resolver 返回新记录、部分还返回缓存里的旧记录,在所有缓存过期之前,每个访客看到什么基本是抛硬币。
最快的修复(多数情况): 删掉所有残留的 A/AAAA/CNAME,只留新目标;确认注册商的 nameserver 真的指向你正在编辑的那个 DNS 区;然后用 Google 的刷新工具 和 Cloudflare 的清除工具 强制几个大公共 resolver 刷新。剩下的就是等原 TTL 过期。
本文讲 DNS 层到底发生了什么、怎么判断你属于哪一类、以及怎么加速过渡。
你属于哪一类?
先跑这一条诊断,免得修错地方:
for dns in 8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222; do
echo -n "$dns: "
dig @$dns +short yourdomain.com
done
| 你看到的现象 | 最可能的原因 | 跳到 |
|---|---|---|
| 同一个 resolver 一次返回两个 IP | 区里有重复/残留 A 记录 | 原因 1 |
| 不同 resolver 返回不同的单个 IP,其中一个是旧的 | 传播不均 / 旧 TTL 高 | 原因 3、4 |
| 其中一个 IP 是注册商/主机的默认页 IP | 老主机仍占着域名,或有隐藏停放记录 | 原因 2、7 |
dig ns yourdomain.com 显示两套不同的 NS | nameserver 委派不一致 | 原因 5 |
IPv4 正常,但 dig AAAA 返回旧 IP | 残留 AAAA 记录 | 原因 6 |
常见原因
按命中率从高到低。
1. 多条 A 记录都在
加了新 A 但从没删旧的。Resolver 对同一个名字收到两条 A,挑一条(通常轮询),于是大约一半请求打到死掉的主机。一个常见变体:某些注册商在你加第一条时会自动再建一条 A(常是 apex 或 www),于是你没手敲也产生了冲突。
怎么判断:
dig yourdomain.com
如果 ;; ANSWER SECTION: 列出两条或更多指向不同 IP 的 A,就是这条。
2. 老主机仍绑着域名
老主机还认为域名”挂着”,它的 IP 被命中时就服务它的默认 404/占位页。即使你改了 DNS,对任何还缓存着旧 IP 的 resolver,它都还在应答。
怎么判断: 打开老主机控制台,看域名是否仍列在它的 domains/sites 下。应该已移除或释放。
3. CDN / 公共 resolver 跨数据中心缓存不均
大型 resolver(Google 8.8.8.8、Cloudflare 1.1.1.1)有很多接入点,不会在同一瞬间让缓存过期。比如 Cloudflare 1.1.1.1 对一条记录最多缓存 3 小时(若记录 TTL 短于此则按 TTL,截至 2026 年 6 月)。一个数据中心可能还握着旧答案,另一个已经返回新的了。
怎么判断:
dig @8.8.8.8 yourdomain.com
dig @1.1.1.1 yourdomain.com
dig @208.67.222.222 yourdomain.com
不同 resolver 返回不同 IP = 传播不均。注意:如果新主机用 Anycast(Vercel、Cloudflare Pages、Netlify 都是),同一个主机名各地合法地解析到同一个对外 IP——所以用这些主机时,“所有 resolver 都返回同一个稳定 IP” 才是完成态,而不是出现多个 IP。
4. 老记录 TTL 高
TTL 为 86400(24 小时)的记录,会让每个 resolver 在你改后最长缓存整整一天。这个缓存在你改动时就已经在跑了,所以没法事后把它缩短。
怎么判断: 看 resolver 当前发出的 TTL。dig 答案里的数字是倒计时——如果你间隔 10 秒查两次、它减了约 10,说明你被一个陈旧缓存服务,它要到归零才会刷新:
dig +noall +answer +ttlunits @8.8.8.8 yourdomain.com
5. nameserver 委派不一致
这是最容易被漏掉的原因。注册商说域名委派给了一套 nameserver,但你实际在另一个提供商的 DNS 区里编辑(或者域名同时还挂着注册商默认 nameserver)。Resolver 可能跟随任一套委派,于是有的拿到你的新记录、有的拿到空区或旧区。现象和传播一模一样,但靠它自己永远不会好。
怎么判断:
dig ns yourdomain.com +short
返回的 nameserver 必须和注册商 “Nameservers” 里显示的完全一致。如果看到两套不同的,或注册商列的 nameserver 跟你正在编辑的区对不上,就去注册商那里修委派。
6. AAAA(IPv6)记录指向别处
A 记录对了,但旧的 AAAA(IPv6)还指向老主机。偏好 IPv6 的访客(多数现代移动运营商)会打到死主机,其余人都正常。
怎么判断:
dig AAAA yourdomain.com +short
应为空或指向新主机。重点:截至 2026 年 6 月,Vercel 不支持第三方自定义域名的 IPv6——如果你在 Vercel 上,任何 AAAA 记录都会让 IPv6 用户访问失败,所以直接全删。
7. 注册商隐藏的停放/预设 A 记录(新域名)
全新域名经常自带一条注册商停放页 A 记录(有时还有通配),它在基础区编辑器里看不到。现象就是教科书式间歇:有时打到你的主机,有时打到一张 “this domain is parked” 页。
怎么判断: 在注册商界面找 “default”/“parking”/“forwarding” 开关,再跑下面的全球检查。如果某个地区返回了你从没设过的 IP,就有隐藏记录在作怪。
最短修复路径
第 1 步:先确认 nameserver 委派
dig ns yourdomain.com +short
如果这跟注册商的 nameserver 列表对不上,先在注册商那里修好再碰别的——否则任何记录改动都不会生效。
第 2 步:清掉所有残留记录
在你掌控的 DNS 区里:
- 删旧
A记录,只留新目标 IP。 - 删任何指向老主机的
CNAME。 - 删指向老主机的
AAAA(在 Vercel 上直接把AAAA全删)。 - 关掉注册商的 “parking”、“forwarding” 或 “domain default” 开关。
第 3 步:让老主机释放域名
在老主机控制台里移除或”释放”域名,让它别再应答。否则它会继续给任何还缓存旧 IP 的人服务默认页。
第 4 步:强制刷新主要公共 resolver
你可以不等就把大 resolver 从陈旧记录上踢下来:
- Google Public DNS(
8.8.8.8/8.8.4.4):dns.google/cache —— 输域名、选 RR 类型(A、AAAA、CNAME)、过验证码、刷新。 - Cloudflare
1.1.1.1:one.one.one.one/purge-cache —— 输域名和记录类型,清除。
这清不掉你 ISP 的 resolver 或单台设备,但能清掉多数检查工具(和多数用户)打到的那两个 resolver。
第 5 步:等原 TTL 过期
对清不掉的缓存,没有捷径——它们只会在旧 TTL 过期时刷新。旧 TTL 是 86400 的话,从你改记录那刻起最多预留 24 小时。
第 6 步:先全球验证,再清本地
先用全球工具看 30+ 个地点,再清自己机器:
- dnschecker.org 或 whatsmydns.net → 输域名 → 每个地区都应显示新 IP。
- 确认全球都绿之后再清本地缓存:
- macOS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - Windows(管理员命令行):
ipconfig /flushdns
- macOS:
怎么确认真的修好了
以下全部成立才算完:
dig ns yourdomain.com +short与注册商完全一致。- “你属于哪一类?“里那段循环从每个 resolver 都返回同一个新 IP。
- whatsmydns.net 每个地区都显示新 IP,没有掉队的。
- 新主机控制台报域名为
Valid Configuration(不再有Invalid Configuration/Domain not configured横幅)。 - 一台在不同网络上的真实设备(手机蜂窝,或 VPN 到另一个国家)反复硬刷都能加载到新站。
哪些情况确实不是你操作错了
DNS 传播天生异步。从你改动到原 TTL 过期之间的几小时里,一些间歇不可避免——没有”这个 ISP 的 resolver 还没让缓存过期”的技术解。如果第 1-3 步都干净、全球工具大体都绿,那就是在等。
容易误判的情况
硬刷浏览器没用,因为问题在上游 DNS,不在浏览器或本地缓存。确认全球传播完成后再清本地 DNS——清太早只会把你最近 resolver 还握着的旧答案重新拉回来。
预防建议(下次)
- 切换至少 24 小时前把记录 TTL 降到
300秒,这样切换时全球缓存已经是短命的。 - 改 DNS 之前先释放老主机绑定,而不是之后。
- 加新记录前先删掉所有残留的
A/AAAA/CNAME。 - 动手前先确认注册商 nameserver 跟你编辑的区一致。
- 改完后等原 TTL 时长再宣布”坏了”。
- 用
dig @8.8.8.8绕开自己的本地缓存测试。
FAQ
- 完整传播多久? 标准记录改动(
A、CNAME、TXT)在 TTL 合理时通常 30 分钟到几小时内在主流 resolver 稳定;旧 TTL 高的话能跑满 24 小时,偶尔 48。nameserver 改动可能要 24-48 小时(据 Vercel 文档,2026 年 6 月)。 - 能提前强制 resolver 刷新吗? 部分能。你能自己刷新两个最大的公共 resolver——Google 在 dns.google/cache、Cloudflare 在 one.one.one.one/purge-cache——但你刷不了任意 ISP 的 resolver 或别人的设备,那些只能按自己的 TTL 过期。
- 为什么
dig看着对、站却还在闪? 你很可能查的是已经刷新过的 resolver,而失败的请求打到了还没刷新的那个。多查几个 resolver(上面那段循环),看 TTL 倒计时找出陈旧那个。 - 我的主机从每个 resolver 都返回 Vercel/Netlify 的 Anycast IP,为什么还间歇? 稳定的 Anycast IP 是对的。如果还闪,原因通常是残留的
AAAA记录(原因 6),或者缺/重记录导致的Invalid Configuration横幅,而不是传播。 - 要不要现在就把 TTL 降下来修这个问题? 现在降 TTL 只会让以后的改动更快——今天卡你的那份缓存是用旧 TTL 设的,在它过期前会无视新值。