识别子域名解析配置冲突,核心是看同一个子域名是否在多个地方被定义了不同结果。常见来源包括DNS解析记录、CNAME与A记录并存、泛解析与精确记录重叠、CDN或代理层回源配置,以及服务器虚拟主机或证书配置。只要同一主机名在不同层级给出不一致的目标,就可能出现时通时断、证书错误或访问到错误站点。
很多人用浏览器能访问某个子域名,就认为解析没有问题。实际上,DNS查询可能返回多个记录,不同网络、不同递归解析器、不同时间拿到的结果可能不同。例如一条A记录指向旧服务器,一条CNAME指向新服务,本地缓存命中旧记录时能打开旧页面,缓存过期后又变成新结果。此时问题不是“有没有解析”,而是“解析结果是否一致且可控”。
另一个误解是把泛解析当成省事方案。泛解析*.example.com会给所有未单独定义的子域名一个默认答案。如果后来为api.example.com添加了精确记录,但泛解析仍然存在,查询时精确记录通常优先,可一旦精确记录被误删或拼写错误,流量就会静默落到泛解析目标上,表现为访问到默认页或错误服务。
在DNS管理界面中,优先检查同一主机名是否存在以下组合:
dig或nslookup查看完整链,而不是只看最终IP。执行检查时,可以分别从本地和公共递归解析器查询同一子域名,观察答案是否一致。若结果不同,先排除TTL缓存因素,再判断是否存在多线路解析、地理DNS或分运营商配置。这些配置本身不是错误,但如果没有明确策略,就会被误认为冲突。
子域名接入CDN或反向代理后,DNS可能只指向CDN节点,真实源站在别处。此时冲突常出现在三层之间:DNS指向的CDN服务、CDN里的回源主机名、源站服务器上的站点绑定。常见现象是访问子域名返回另一个站点的证书或默认页,原因可能是源站没有绑定该子域名,或CDN回源时使用了错误的Host头。
判断方法是从源站直接测试:在服务器上用curl指定Host头访问本地服务,看返回内容是否与通过CDN访问一致。如果不一致,问题在源站虚拟主机或回源Host配置,而不是DNS。若一致但证书不匹配,则检查CDN证书绑定和源站证书是否覆盖该子域名。
另一种冲突是DNS已经切到新服务,但旧服务器仍在运行并保留相同子域名的解析记录或本地hosts绑定。这种情况下,部分内网用户可能仍访问旧服务。检查项包括旧DNS区域是否仍被委派、旧服务器是否仍响应、客户端是否有hosts或内部DNS覆盖。
发现冲突后,常见处理方案有两种:一是保留泛解析,用精确记录覆盖个别子域名;二是取消泛解析,为每个子域名显式添加记录。
保留泛解析适合子域名数量多、变化快、且默认目标确实能承接未知子域名的场景。适用条件是默认目标有明确用途,例如统一跳转页或统一错误页,并且团队能保证精确记录不被误删。判断结果是:随机子域名应返回预期默认行为,而不是暴露内部服务或错误证书。
取消泛解析适合子域名数量可控、每个子域名都有明确归属的场景。适用条件是团队能维护记录清单,新增子域名时有流程可循。判断结果是:查询不存在的子域名应返回NXDOMAIN或明确无记录,而不是落到某个真实服务器。这样能减少“幽灵解析”带来的误访问和排查成本。
下一步,建议先为当前子域名建立一份记录清单,写明每条记录的用途、目标、TTL和负责人。之后每次变更前对照清单检查是否存在重叠定义,这比事后从访问现象反推冲突更可靠。