找回密码
 立即注册
搜索

[开发] 为什么修改 hosts 不立即生效?-- 浏览器 DNS 缓存机制分析

[复制链接]
智慧谋略 发表于 2023-11-21 00:48:34 | 显示全部楼层 |阅读模式
经常做 Web 开发的工程师,都会遇到需要将某个域名绑定到特定 IP 上,进行测试的情况。大家一般都会用修改 hosts 文件的方式来解决,但是经常也会遇到修改 hosts 不生效的情况,而且有时生效,有时不生效的情况也有发生,这到底是为什么呢?

### 起:DNS 缓存机制
关于 DNS 缓存的机制,简单来说,一条域名的 DNS 记录会在本地有两种缓存:浏览器缓存和操作系统 (OS) 缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问 OS 缓存,最后再访问 DNS 服务器 (一般是 ISP 提供),然后 DNS 服务器会递归式的查找域名记录,然后返回。
DNS 记录会有一个 ttl 值 (time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,OS 缓存会参考 ttl 值,但是不完全等于 ttl 值,而浏览器 DNS 缓存的时间跟 ttl 值无关,每种浏览器都使用一个固定值。  
 
后来我也做过测试,Mac 下 Chrome (23.0.1271.101) 的 DNS 缓存时间是 1 分钟。Safari 下 DNS 缓存时间大约为 10 秒。

### 解:hosts 文件修改的原理
那么在修改 hosts 文件之后,发生了什么事情呢?这里不妨先提提 Chrome 下的一个工具:[url=]chrome://net-internals/#dns[/url]。这里列出了目前系统中的 DNS 缓存和 Chrome 中使用的情况。通过这个工具,可以看到: 在修改 hosts 文件后,所有 OS 中 DNS 缓存会被清空,而浏览器缓存则不发生变化。 网上盛传 [url=]chrome://net-internals/#dns[/url] 下的 "Clear Host Cache" 可以清空 DNS 缓存,这里博主做了一个测试,这里清空的仅仅是 OS 的缓存,而并非浏览器 DNS 缓存。当某条 DNS 记录显示 "Expired" 的时候,才表示浏览器 DNS 缓存已经被清除。所以使用 Clear Host Cache 其实是没有用的。
那么回到最初的问题上来,为什么修改 hosts 文件之后,有时会立刻生效,有时却一直不生效呢?其实原因很简单,这是因为浏览器缓存的过期时间,是从某个域名上次查询 DNS 记录开始计算的。
例如:我 00 秒的时候使用 chrome 访问过 www.google.com.hk,此时浏览器 DNS 缓存产生,然后我修改了 hosts 文件,将 www.google.com.hk 指向本地 127.0.0.1,然后在 05 秒的时候尝试再次访问这个地址,因为浏览器 DNS 缓存未过期,所以 hosts 修改无法体现出来。
另一种情况下,我很久都没有访问 www.baidu.com 了,然后我修改了 hosts 文件,将其指向 127.0.0.1,这时因为浏览器没有 DNS 缓存,所以会查询操作系统中的 DNS 缓存,结果此时 hosts 文件生效!
前面也提到,Safari 的浏览器 DNS 缓存时间大约为 10 秒,所以一般调试程序的时候,很多人都习惯修改 hosts 后,用 Safari 来调试,因为大部分情况下,修改 hosts 之后,浏览器 DNS 缓存已经失效了。
那么怎么主动清除浏览器 DNS 缓存呢?博主目前也没有找到办法,测试过 Chrome 下的 “清除缓存” 选项,发现没有起到期望的效果。
那么,就请在修改 hosts 之后,耐下心来,稍等几十秒吧。
最后打个广告,博主正在开发一款比修改 hosts 更方便的 DNS 更改工具,应该能够在新年推出,敬请期待!
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|探索掌握未知、共创美好未来

GMT+8, 2026-9-17 02:30 , Processed in 0.044082 second(s), 29 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表