为什么联调总绕不开 hosts

前端要拿"真实域名 + HTTPS 证书"访问本机服务;测试想看看新版本在真实域名下的表现,又不想动线上 DNS;广告和埋点域名想让它彻底哑火。这些事的共同答案都是改 hosts——比等运维配 DNS、比装一排浏览器插件都快得多。

原理:hosts 先于 DNS

操作系统解析域名时,先查 hosts 文件,查不到才去问 DNS 服务器。所以 hosts 里的记录优先级高于任何 DNS 配置,这也是它"像开关"的原因:写一行,立刻把域名指到任意 IP;删一行,恢复原状。格式是每行两段:

1
2
127.0.0.1  api.dev.example.com
0.0.0.0    ads.example.com

场景一:本地域名映射三步走

第一步,生成片段。手写 hosts 容易拼错域名、写出重复条目。用hosts 片段生成器输入"IP + 域名"清单,它会做域名校验与去重,输出格式规范的 hosts 片段,页面还附各系统的应用方法。

第二步,分系统粘贴。

  • macOS / Linux:/etc/hosts,需要 sudo 权限编辑
  • Windows:C:\Windows\System32\drivers\etc\hosts,用管理员身份打开编辑器再保存

第三步,刷新 DNS 缓存。

1
2
3
4
# macOS
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
# Windows
ipconfig /flushdns

完成后浏览器访问 api.dev.example.com,流量就已落在你指定的 IP 上。再配一个 mkcert 之类的本地证书工具,“真实域名 + HTTPS"的联调环境就齐了。

场景二:批量屏蔽广告域名

把广告、埋点域名指向 0.0.0.0,请求会在连接阶段直接失败,对应的上报、banner 全部哑火。hosts 片段生成器同样能生成屏蔽用途的整段片段,粘贴一次,对所有浏览器和应用全局生效。

为什么用 0.0.0.0 而不是 127.0.0.1?指到 127.0.0.1 时请求仍会打到本机,如果本地恰好有服务占着 80/443 端口,就会收到一堆莫名请求;0.0.0.0 让连接直接失败,干净利落。

改了不生效?按顺序排查

  1. 浏览器自带 DNS 缓存:Chrome 有独立缓存,地址栏打开 chrome://net-internals/#dns,点 Clear host cache。
  2. 保存姿势不对:Windows 下别把文件存成 hosts.txt;也别让编辑器给文件加 BOM——用生成器输出的标准格式最稳。
  3. 浏览器开了安全 DNS(DoH):这时解析绕过系统,hosts 自然失效,关掉该选项或在排除名单里处理。
  4. 服务跑在 IPv6 上:你把域名指到了 IPv4,系统却解析出 IPv6 记录走了 ::1。hosts 同样支持写 IPv6 地址,写法拿不准可以用 IPv6 地址转换工具核对——它能做 IPv6 的压缩与展开互转、识别 ::ffff:127.0.0.1 这类 IPv4 映射地址,写双栈记录时很有用。

进阶:与 nginx 反代配合做切流

hosts 只解决"域名指到哪台机器”。想让 api.example.com 按路径分发到本地不同容器或端口,常见组合是:hosts 把域名指向网关机(或本机),网关上的 nginx 按 server_name 和 location 转发——用一套本地配置复刻线上拓扑,联调时把流量"切"到任意一环。

切流配置生效后,最后一步是验证流量真的走了新链路:用 IP 信息查询查当前出口 IP 的地理位置、运营商与 ASN。如果流量切到了代理或云上网关,归属地会立刻现形。

常见问题

hosts 支持通配符吗?

不支持。每行只能写"精确 IP + 精确域名",*.example.com 这种写法无效。要覆盖一整组子域,用生成器逐条生成再粘贴,虽然土但可靠。

改完 hosts 需要重启吗?

不需要重启系统,多数应用在下次解析时就能读到新记录。要做的只是刷新系统 DNS 缓存和浏览器缓存,个别常驻服务可能需要重启进程。

为什么同事的 hosts 映射对我不管用?

hosts 只作用于本机。想共享一套映射,把生成器输出的片段提交到团队仓库,各自粘贴应用;跨团队大批量管理域名映射,则应该上内部 DNS(如 dnsmasq),而不是继续堆 hosts。

小结

hosts 的三板斧:映射本地域名、批量屏蔽广告域名、配合反代切流。片段交给 hosts 片段生成器生成,IPv6 写法用 IPv6 地址转换工具核对,出口验证交给 IP 信息查询——这几个工具都收录在网络排查工具包专题里。

排查网络问题时还常用到 CIDR 与子网计算等基本功,见《CIDR 与子网速成:写给开发者的网络课》。