Update:
相信很多同学都在使用 SwitchHosts/iHosts/Gas Mask 等 Hosts 管理工具,当然也有人直接修改 /etc/hosts
或者 system32/drivers/etc/hosts
文件,而经常遇到的疑问是:咿,刚才不是修改并且保存了么,为何 Chrome 浏览器还不生效呢?
结果就是,进入隐私模式的都好了,重启、清空缓存DNS和等一分钟的同学还在继续纠结中。。。
上面提到的三个工具,SwitchHosts/iHosts/Gas Mask,其实也只有 iHosts 生效了(Mac下)。
开发过程中我们会无数次的切换 Hosts,如果不知道原理,我们在测试的时候还是很心惊胆战的=_=||
因为服务器设置了 keep-alive
!次要原因是存在浏览器 DNS 缓存和系统 DNS 缓存。
> Keep-alive 相关文档
服务器在响应头设置了 Connection: keep-alive
(一般的网页都会设置 keep-alive,保持长连接,避免多次连接产生网络消耗)之后,客户端会跟服务器保持长连接,只要长连接不断开,页面在请求的时候就不会重新解析域名!
我们可以这样来测试:
127.0.0.1 www.taobao.com
# 127.0.0.1 www.taobao.com
,再打开 www.taobao.com,很好,正常打开了 <这里说明 hosts 修改也生效了>127.0.0.1 www.taobao.com
,再打开 www.taobao.com,依然可以访问!!!close idle sockets
按钮,可以关闭所有的长连接重启浏览器之后,所有的连接(包括长连接)都会断开,自然就生效了
因为隐私模式下不会复用 TCP 连接,新开连接的时候,会重新解析 DNS 域名,自然也生效了
因为我在 Windows 下测试过,貌似没有立即生效。问了 iHosts 的作者@必隆,他告诉我,在修改 hosts 文件的时候,会重启网络服务,这个时候必然会断开所有的 TCP 连接(重启网络服务,差不多相当于先断网再联网...)
“等一会儿”,要稍微等久一点,keep-alive
的默认设置是 120s,开发者也有可能增大或者减小这个配置,所以“等一会儿”也是很伤神的=。 =
看到这里,你对其中的原理是否有所了解了呢?