1. 程式人生 > >修改Host為什麼不生效

修改Host為什麼不生效

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 按鈕,可以關閉所有的長連線

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

1. 重啟瀏覽器

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

2. 隱私模式開啟

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

3. iHosts 管理器在 Mac 下生效

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

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

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

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