修改Hosts為何不生效,是DNS緩存?


Update:

  • 如果瀏覽器使用了代理工具,修改 Hosts 也不會生效。這里是因為,瀏覽器會優先考慮代理工具(如添加 pac 文件、SwitchySharp等)的代理,建議調試的時候先關閉這些代理。
  • 使用 pac 文件代理有的時候部分文件的代理不生效,應該是 pac 對應的代理服務器上,做了部分處理。
  • 部分瀏覽器也有 DNS 緩存,如 chrome(chrome://dns),這是為什么重啟瀏覽器也不生效的原因,一般設定時間為 60s (如 Firefox)。
  • 瀏覽器有DNS緩存,系統也會存在 DNS 緩存,有的時候即便在 chrome://dns 清空了瀏覽器 DNS 緩存,依然不生效,是因為系統 DNS 緩存還未刷新,刷新方式可以看這篇文章

 相信很多同學都在使用 SwitchHosts/iHosts/Gas Mask 等 Hosts 管理工具,當然也有人直接修改 /etc/hosts 或者 system32/drivers/etc/hosts 文件,而經常遇到的疑問是:咿,剛才不是修改並且保存了么,為何 Chrome 瀏覽器還不生效呢?

  • 有人說重啟下瀏覽器就好了,
  • 有人說清空下緩存 DNS(chrome://net-internals/#DNS)就好了,
  • 有人說隱私模式下打開就好了,
  • 有人說等一分鍾吧...

結果就是,進入隱私模式的都好了,重啟、清空緩存DNS和等一分鍾的同學還在繼續糾結中。。。

上面提到的三個工具,SwitchHosts/iHosts/Gas Mask,其實也只有 iHosts 生效了(Mac下)。

開發過程中我們會無數次的切換 Hosts,如果不知道原理,我們在測試的時候還是很心驚膽戰的=_=||

修改Hosts不生效的根本原因

因為服務器設置了 keep-alive !次要原因是存在瀏覽器 DNS 緩存和系統 DNS 緩存。

> Keep-alive 相關文檔

服務器在響應頭設置了 Connection: keep-alive (一般的網頁都會設置 keep-alive,保持長連接,避免多次連接產生網絡消耗)之后,客戶端會跟服務器保持長連接,只要長連接不斷開,頁面在請求的時候就不會重新解析域名!

我們可以這樣來測試:

  1. 打開一個你至少兩分鍾沒有打開的瀏覽器(你也可以關閉掉你的瀏覽器,然后重新打開,記得把所有的 tab 都關了,除了當前 tab ^_^)
  2. 在 hosts 添加 127.0.0.1 www.taobao.com
  3. 新開 tab,打開 www.taobao.com,是不是進不去了 <這里說明 hosts 修改生效了>
  4. 注釋掉剛才hosts修改,# 127.0.0.1 www.taobao.com ,再打開 www.taobao.com,很好,正常打開了 <這里說明 hosts 修改也生效了>
  5. 去掉注釋符,127.0.0.1 www.taobao.com ,再打開 www.taobao.com,依然可以訪問!!!
  6. Chrome 中進入 chrome://net-internals/#sockets,,可以看到淘寶首頁中很多域名都是與服務器保持着長連接,點擊上方的 close idle sockets 按鈕,可以關閉所有的長連接
  7. 此時,再去訪問 www.taobao.com,是不是進不去了!

為何一些修改可以讓 “Hosts 生效”

1. 重啟瀏覽器

重啟瀏覽器之后,所有的連接(包括長連接)都會斷開,自然就生效了

2. 隱私模式打開

因為隱私模式下不會復用 TCP 連接,新開連接的時候,會重新解析 DNS 域名,自然也生效了

3. iHosts 管理器在 Mac 下生效

因為我在 Windows 下測試過,貌似沒有立即生效。問了 iHosts 的作者@必隆,他告訴我,在修改 hosts 文件的時候,會重啟網絡服務,這個時候必然會斷開所有的 TCP 連接(重啟網絡服務,差不多相當於先斷網再聯網...)

4. 修改之后,等一會兒...

“等一會兒”,要稍微等久一點,keep-alive 的默認設置是 120s,開發者也有可能增大或者減小這個配置,所以“等一會兒”也是很傷神的=。 =

看到這里,你對其中的原理是否有所了解了呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM