常常作Web开发的工程师,都会遇到须要将某个域名绑定到特定IP上,进行测试的状况。你们通常都会用修改hosts文件的方式来解决,可是常常也会遇到修改hosts不生效的状况,并且有时生效,有时不生效的状况也有发生,这究竟是为何呢?web
###起:DNS缓存机制chrome
关于DNS缓存的机制,有一篇很是详细的文章What really happens when you navigate to a URL。浏览器
简单来讲,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操做系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,若是未命中则访问OS缓存,最后再访问DNS服务器(通常是ISP提供),而后DNS服务器会递归式的查找域名记录,而后返回。缓存
DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。通过实验,OS缓存会参考ttl值,可是不彻底等于ttl值,而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值。 这里有一篇文章,作过详细的测试Why Web Browser DNS Caching Can Be A Bad Thing:服务器
后来我也作过测试,Mac下Chrome(23.0.1271.101)的DNS缓存时间是1分钟。Safari下DNS缓存时间大约为10秒。app
###解:hosts文件修改的原理工具
那么在修改hosts文件以后,发生了什么事情呢?这里不妨先提提Chrome下的一个工具:chrome://net-internals/#dns。这里列出了目前系统中的DNS缓存和Chrome中使用的状况。经过这个工具,能够看到: 在修改hosts文件后,全部OS中DNS缓存会被清空,而浏览器缓存则不发生变化。 网上盛传chrome://net-internals/#dns下的"Clear Host Cache"能够清空DNS缓存,这里博主作了一个测试,这里清空的仅仅是OS的缓存,而并不是浏览器DNS缓存。当某条DNS记录显示"Expired"的时候,才表示浏览器DNS缓存已经被清除。因此使用Clear Host Cache实际上是没有用的。测试
那么回到最初的问题上来,为何修改hosts文件以后,有时会马上生效,有时却一直不生效呢?其实缘由很简单,这是由于浏览器缓存的过时时间,是从某个域名上次查询DNS记录开始计算的。google
例如:我00秒的时候使用chrome访问过www.google.com.hk,此时浏览器DNS缓存产生,而后我修改了hosts文件,将www.google.com.hk指向本地127.0.0.1,而后在05秒的时候尝试再次访问这个地址,由于浏览器DNS缓存未过时,因此hosts修改没法体现出来。url
另外一种状况下,我好久都没有访问www.baidu.com了,而后我修改了hosts文件,将其指向127.0.0.1,这时由于浏览器没有DNS缓存,因此会查询操做系统中的DNS缓存,结果此时hosts文件生效!
前面也提到,Safari的浏览器DNS缓存时间大约为10秒,因此通常调试程序的时候,不少人都习惯修改hosts后,用Safari来调试,由于大部分状况下,修改hosts以后,浏览器DNS缓存已经失效了。
那么怎么主动清除浏览器DNS缓存呢?博主目前也没有找到办法,测试过Chrome下的“清除缓存”选项,发现没有起到指望的效果。
那么,就请在修改hosts以后,耐下心来,稍等几十秒吧。
最后打个广告,博主正在开发一款比修改hosts更方便的DNS更改工具,应该可以在新年推出,敬请期待!