为什么修改hosts不立即生效?--浏览器DNS缓存机制分析
来源:互联网 发布:河南大学软件学院课表 编辑:程序博客网 时间:2024/06/05 23:41
经常做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:
后来我也做过测试,Mac下Chrome(23.0.1271.101)的DNS缓存时间是1分钟。Safari下DNS缓存时间大约为10秒。
解: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记录开始计算的。
例如:我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之后,耐下心来,稍等几十秒吧。
from:https://my.oschina.net/flashsword/blog/99068
- 为什么修改hosts不立即生效?--浏览器DNS缓存机制分析
- 为什么修改hosts不立即生效?--浏览器DNS缓存机制分析 【转】
- 为什么修改hosts不立即生效?--浏览器DNS缓存机制分析
- 为什么修改hosts不立即生效?--浏览器DNS缓存机制分析
- 修改Hosts为何不生效,是DNS缓存?
- 修改hosts不生效,清理本地DNS缓冲
- 浏览器DNS缓存机制分析
- 浏览器DNS缓存机制分析
- windows 修改hosts 立即生效的方法
- hosts立即生效方法
- 转载:浏览器DNS缓存机制分析
- ubuntu修改hosts立即生效的简单方法
- switchHosts!修改hosts后不能立即生效的问题
- 修改windows hosts不生效原因
- hosts立即生效的方法
- 修改Host为什么不生效
- linux IP的设置 修改DNS 解析 hosts生效
- 修改注册表立即生效
- leetcode242. Valid Anagram
- spring注解识别一个接口的多个实现类
- linux如何查询进程占用的内存
- 深度学习(二十二)Dropout浅层理解与实现
- dialog 设置全屏
- 为什么修改hosts不立即生效?--浏览器DNS缓存机制分析
- iframe 父页面与子页面之间的方法、属性的相互调用
- android studio building卡死
- MYSQL时间类型datetime和timestamp的区别
- Gnome-Ubuntu安装与个性化配置
- Spark相关文章索引(1)
- Mysql基础学习
- ubuntu忘记开机root密码
- Android-fragment-详解