Chrome访问域名仍解析到旧IP,需逐层排查:先确认/etc/hosts语法正确、权限足够且无干扰文件;再用ping和nslookup验证系统解析是否生效;然后清空Chrome的DNS缓存、关闭空闲sockets、禁用预测服务,并彻底退出Chrome进程。

Mac上修改了/etc/hosts文件,Chrome访问域名却仍解析到旧IP,说明系统或浏览器未按预期读取新映射——这通常不是hosts写错,而是缓存链路中某一层仍在生效,必须逐层验证并清除。
确认hosts语法与权限是否正确
打开终端,执行:sudo cat /etc/hosts,检查新增行是否符合「IP地址+至少一个空格+完整域名」格式,例如127.0.0.1 dev.local;注意不能有制表符、中文空格或末尾注释(#后内容必须独占一行)。
若用文本编辑器保存过hosts,务必确认编码为UTF-8无BOM;macOS下用nano或vim编辑更稳妥,避免TextEdit等富文本工具悄悄插入不可见字符。
【关键前提】修改后必须保存且未被其他进程锁定——若提示“Permission denied”,说明未用sudo权限写入,该行实际未生效。
验证系统级解析是否已走hosts
在终端中运行:ping -c 1 translate.googleapis.com(替换为你修改的域名),观察返回的IP是否与hosts中指定的一致。
如果返回的是公网IP而非你填的IP,说明系统解析器根本没读取hosts——此时请检查:是否误将hosts文件保存为hosts.txt?是否在/etc/hosts同目录下存在hosts~或.hosts.swp等干扰文件?
再执行:nslookup translate.googleapis.com 127.0.0.1,该命令绕过hosts直接查DNS,用于交叉比对;若nslookup返回新IP而ping返回旧IP,基本可排除hosts问题,聚焦浏览器缓存。
强制清空Chrome DNS缓存并禁用预获取
第一步:在Chrome地址栏输入chrome://net-internals/#dns→回车→等待页面加载完成→点击Clear host cache按钮。
第二步:Chrome会复用TCP连接池,即使DNS缓存清空,旧Socket仍绑定原IP。必须同步刷新:在地址栏输入chrome://net-internals/#sockets→点击Close idle sockets→再点Flush socket pools。
第三步:关闭Chrome的DNS预获取功能,防止它提前用旧缓存发起请求。进入chrome://settings/privacy→搜索“预测”→关闭「使用预测服务来加快网页加载速度」选项。
这一步做完无需重启Chrome,但必须关闭所有Chrome窗口(包括后台进程),可在活动监视器中搜索“Google Chrome”并强制退出残留进程,否则旧socket可能继续存活。
绕过DNS缓存的终极验证法
方法一:用curl直连验证系统行为
终端执行:curl -v http://dev.local(替换为你配置的域名)。若响应头中显示* Connected to dev.local (127.0.0.1),证明系统层hosts已生效;若显示其他IP,问题仍在系统配置。
方法二:启用Chrome隐身窗口+禁用所有扩展
按Cmd+Shift+N新建隐身窗口→访问目标域名→右键检查元素→Network标签页中查看请求的真实目标IP(在Headers → Remote Address列)。
【易错点】不要用Safari或Firefox测试——它们的缓存机制与Chrome不同,结果不具备参考性。


















