域名解析不生效怎么查(2026):用 dig 一层层追,看清是谁在缓存

换服务器、上 CDN、改解析,最让人头大的不是网站直接打不开,而是「有的地方好了有的地方还是老样子」,你自己这边是新站,切到手机流量是旧的,或者反过来。这种时候 ping 帮不上忙,它只告诉你本地缓存里现在是什么,源头对不对它不知道。得用 dig 一层层往上问。

先搞清楚缓存有三层

域名解析不是请求一次就定死的,中间至少有三层各自拿着副本。

第一层是你自己的系统,操作系统和浏览器都能缓存「域名对应哪个 IP」。第二层是递归 DNS,你电脑上配的那个 DNS 服务器就干这事,家里的路由器、运营商的 DNS、你手填的 114 或者 223.5.5.5 都算,它替你去问,然后把答案缓存下来。第三层是权威 DNS,域名商分配给你的那两台 NS,记录以它为准。

每层只认 TTL 这个倒计时,TTL 没归零之前,你改记录跟这一层没关系,它照样把旧值给你。所以查解析的套路就一句话:权威上是新的、递归上是旧的,等着就行;权威上还是旧的,别等了,你的改动压根没生效。

前置条件

Linux 和 macOS 自带 dig,Windows 10/11 先试 PowerShell 的 Resolve-DnsName,要 dig 得另外装 BIND 工具或者用 WSL,装法以你的发行版为准。另外手上得有域名商后台的登录权限,能改记录、能看到 NS 是哪两台。

分步排查

1. 先看本地拿到什么

dig +short www.example.com
dig +noall +answer www.example.com

第二条命令的答案里,第二列的数字就是 TTL,它表示这条记录在当前缓存里还能活多久。从递归 DNS 拿到的结果会随着时间往 0 掉,快过期的时候你会看到个位数,刚从权威拿下来则是完整的大数字。

2. 换公共 DNS 再问一遍

dig @223.5.5.5 +short www.example.com
dig @8.8.8.8 +short www.example.com

两个公共 DNS 给的结果不一样,不用急着判断坏了,缓存没同步完就是这个样子,过几分钟再查往往还是这样。

3. 绕过缓存,直接问权威

dig NS example.com +short
dig @fuji.ns.atrustdns.com example.com +short

第二行把 NS 换成上一行查到的名字。这个答案代表源头,它要是旧的,说明记录没改成功、改错了主机名,或者改到别的解析线路去了。

4. 追整条链路,看卡在哪一步

dig +trace www.example.com

它从根服务器开始,一路问 .com、问你的域名商,最后问到权威,每一步的答案都打出来。某一步返回 SERVFAIL 或者干脆停住,问题就在那一环,域名过期被注册商停了、NS 填错、上级委派没更新,都从这个输出里看得出来。

5. 分清 A、CNAME 和 AAAA

上了 CDN 之后 www 一般会变成一条 CNAME,指向 CDN 给你的别名,这时候 +short 出来的是个域名而不是 IP,别以为解析错了。AAAA 是 IPv6 记录,有些网络优先走 v6,v6 没跟着改,表现就是「Wi-Fi 打不开,切流量就好了」。

dig +short AAAA www.example.com

6. DNS 层和 HTTP 层分开测

解析通了不代表站点能开。

curl -sSI --resolve www.example.com:443:1.2.3.4 https://www.example.com | head -1

--resolve 让 curl 强行把这个域名当成某个 IP,跳过 DNS 直接打到你指定的那台机器,用来验证「解析指到新服务器的话,站是不是对的」。换服务器之前先这么测一遍源站,比切完解析再手忙脚乱强太多。

怎么算修好了

权威 NS 的答案和公共 DNS 的答案一致,TTL 正常递减;换个网络、用手机流量也能打开;curl 返回 200 或者 301,不是连接被拒。三条都满足才算收工。

常见的坑

改记录之前先把 TTL 调小,比如 300 秒,等旧 TTL 熬过去再动 A 记录,这样留出的回滚窗口只有几分钟。省了这一步,一条 TTL 86400 的记录改错了,你得陪它耗一天。

本地缓存也得清。macOS 上 sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder,Windows 上 ipconfig /flushdns,浏览器自己还缓存着一层。还有两个容易漏的:/etc/hosts 里留着手写的老记录,代理软件(Clash 这类)给域名配了固定解析,它们都排在 DNS 前面把请求截走。

CNAME 和 A 记录不能挂在同一个名字上,泛解析 * 会把你没想到的子域一起接走。换服务器最常见的低级错误是只改 www,裸域那条还是旧 IP,两个是互相独立的两条记录。

出事了怎么退回去

把 A 记录的 IP 改回旧的,TTL 保持小值,几分钟后大部分地方就能恢复。上 CDN 也照这个思路,先用 --resolve 直连源站测通,再切 CNAME,顺序倒过来,出了问题你手里就没有能立刻回去的状态。

解析这东西查完,顺手还能看两眼别的。换了 IP 之后证书没跟上,浏览器的报错看起来跟「站打不开」一模一样,HTTPS 证书还剩几天到期?一条 openssl 命令查清 里那条命令我基本是改完解析必跑一次;如果解析是通的、站点却返回 502,那是另一类问题,WordPress 502 和白屏排障 从 nginx 日志往上查;真要整站换域名,操作顺序别搞反,WordPress 搬家加换域名 那篇写了怎么用 WP-CLI 一次替换干净。

DNS 的坑大多不难,难的是等。把 TTL 当成一笔必须交的税,动任何解析之前先交上,后面就顺了。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容