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,保持長連接,避免多次連接產生網絡消耗)之后,客戶端會跟服務器保持長連接,只要長連接不斷開,頁面在請求的時候就不會重新解析域名!
我們可以這樣來測試:
- 打開一個你至少兩分鍾沒有打開的瀏覽器(你也可以關閉掉你的瀏覽器,然后重新打開,記得把所有的 tab 都關了,除了當前 tab ^_^)
- 在 hosts 添加
127.0.0.1 www.taobao.com
- 新開 tab,打開 www.taobao.com,是不是進不去了 <這里說明 hosts 修改生效了>
- 注釋掉剛才hosts修改,
# 127.0.0.1 www.taobao.com
,再打開 www.taobao.com,很好,正常打開了 <這里說明 hosts 修改也生效了> - 去掉注釋符,
127.0.0.1 www.taobao.com
,再打開 www.taobao.com,依然可以訪問!!! - Chrome 中進入 chrome://net-internals/#sockets,
,可以看到淘寶首頁中很多域名都是與服務器保持着長連接,點擊上方的
close idle sockets
按鈕,可以關閉所有的長連接 - 此時,再去訪問 www.taobao.com,是不是進不去了!
為何一些修改可以讓 “Hosts 生效”
1. 重啟瀏覽器
重啟瀏覽器之后,所有的連接(包括長連接)都會斷開,自然就生效了
2. 隱私模式打開
因為隱私模式下不會復用 TCP 連接,新開連接的時候,會重新解析 DNS 域名,自然也生效了
3. iHosts 管理器在 Mac 下生效
因為我在 Windows 下測試過,貌似沒有立即生效。問了 iHosts 的作者@必隆,他告訴我,在修改 hosts 文件的時候,會重啟網絡服務,這個時候必然會斷開所有的 TCP 連接(重啟網絡服務,差不多相當於先斷網再聯網...)
4. 修改之后,等一會兒...
“等一會兒”,要稍微等久一點,keep-alive
的默認設置是 120s,開發者也有可能增大或者減小這個配置,所以“等一會兒”也是很傷神的=。 =
看到這里,你對其中的原理是否有所了解了呢?