1. 程式人生 > >為什麼修改hosts不立即生效?--瀏覽器DNS快取機制分析

為什麼修改hosts不立即生效?--瀏覽器DNS快取機制分析

經常做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

image

後來我也做過測試,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之後,耐下心來,稍等幾十秒吧。

原文地址:https://my.oschina.net/flashsword/blog/99068