浏览器的DNS缓存

经过设置hosts文件能够强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后从新开启;若是不想重启浏览器,只须要清空浏览器的DNS缓存便可。清空DNS缓存在chrome、firefox下很容易作到。具体操做以下:linux

chrome:在浏览器的地址栏中输入 chrome://net-internals/#dns 并回车,该页面会显示当前全部DNS缓存,经过点击“Clear host cache”,能够清空全部DNS缓存。有时候此方法可能不能马上生效,可使用另一个设置,在地址栏中输入 chrome://settings/ 并回车,经过搜索“预测网络操做”找到配置项“预测网络操做,以提升网页加载速度”,去掉前面的勾便可。web

firefox:在地址栏中 about:config 并回车,可能会出现一个警告信息,直接点击按钮进入,会出现firefox的全部配置信息,经过搜索dns进行过滤,能够看到一项名为 network.dnsCacheExpirationGracePeriod 项,它对应的值就是DNS缓存的时间,双击此项,会出现修改的提示框,填入 0 (不缓存DNS)便可。chrome

 

缘起。。。恼火。。。windows

各大浏览器默认开启了DNS缓存功能,因此在先访问有个不存在域名后,再把该域名添加到本地hosts文件指向本地后,用该浏览器访问依然会提示域名不存在。。。浏览器

解决方案:缓存

Firefox解决方式:bash

Firefox有dns缓存功能,可是默认缓存时间只有1分钟,能够经过修改该默认值加快DNS解析速度,方法以下:
打开一个新的窗口,地址栏输 入 about:config,回车,进入设置界面。而后搜索 network.dnsCacheExpiration ,把原来的60改为 6000(表示缓存6000秒),再搜索network.dnsCacheEntries 把默认的20改为1000(表示缓存1000条)。若是没 有上面两个项目,新建它们便可,新建条目类型为整数型。 固然也能够按照须要设置成其它的值。
可是dns缓存过久了也会出问题,好比有的网站ip换了,就没法访问了。
针对这样的问题,还能够安装一个 firefox 插件来开启或者 关闭dns cache功能,https://addons.mozilla.org/zh-CN/firefox/addon/5914 。服务器

IE解决方式:网络

禁用DNS缓存的方法,将下面内容保存为注册表文件,在运行写入注册表:app

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=dword:00000000
"DnsCacheTimeout"=dword:00000000
"ServerInfoTimeOut"=dword:00000000

写入注册表之后IE将再也不缓存DNS,咱们对hosts便会当即生效,无需再重启浏览器。

若是须要恢复IE的DNS缓存,只需清楚咱们以前写入的注册表内容。跟上面的方法同样:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=-
"DnsCacheTimeout"=-
"ServerInfoTimeOut"=-

Chrome浏览器:

为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地创建DNS缓存的方法,加快网站的链接速度。你在谷歌Chrome浏览器的地址栏中输入about:DNS,回车,就能够看到本地的DNS缓存。

firefox下有个DNS Flusher插件,但没有chrome版本,其实在chrome下清除DNS缓存很是简单:
一、用chrome打开:chrome://net-internals/#dns
二、点击上面的“clean host cache”

也能够清空在工具中选择清空Cache,这样DNS cache会一同清空。

微软windows下如何清空dns

 

 

 在微软windows下,你能够用命令ipconfig /flushd ns来清空dns 缓存内容。

你也能够用命令ipconfig /displaydns 来查看dns缓存内容。


 

Mac OSX下如何清空dns缓存

 


在Mac OSX中,你能够用这个命令lookupd -flushcache 来清空保留的缓存。
bash-2.05a$ lookupd -flushcache


 

Linux 下如何清空dns缓存

在linux中,nscd进程负责管理DNS缓存。
要清空DNS缓存,重启nscd守护进程就好了。
要重启nscd进程,使用命令(不带引号)'/etc/rc.d/init.d/nscd restart '

 

 

 

常常作Web开发的工程师,都会遇到须要将某个域名绑定到特定IP上,进行测试的状况。你们通常都会用修改hosts文件的方式来解决,可是常常也会遇到修改hosts不生效的状况,并且有时生效,有时不生效的状况也有发生,这究竟是为何呢?

起:DNS缓存机制

关于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

image

后来我也作过测试,Mac下Chrome(23.0.1271.101)的DNS缓存时间是1分钟。Safari下DNS缓存时间大约为10秒。

解:hosts文件修改的原理

那么在修改hosts文件以后,发生了什么事情呢?这里不妨先提提Chrome下的一个工具:chrome://net-internals/#dns。这里列出了目前系统中的DNS缓存和Chrome中使用的状况。经过这个工具,能够看到:

1 **在修改hosts文件后,全部OS中DNS缓存会被清空,而浏览器缓存则不发生变化。**

网上盛传chrome://net-internals/#dns下的"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更改工具,应该可以在新年推出,敬请期待!

相关文章
相关标签/搜索