常常作Web開發的工程師,都會遇到須要將某個域名綁定到特定IP上,進行測試的狀況。你們通常都會用修改hosts文件的方式來解決,可是常常也會遇到修改hosts不生效的狀況,並且有時生效,有時不生效的狀況也有發生,這究竟是爲何呢?web
###起:DNS緩存機制chrome
關於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:服務器
後來我也作過測試,Mac下Chrome(23.0.1271.101)的DNS緩存時間是1分鐘。Safari下DNS緩存時間大約爲10秒。app
###解: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記錄開始計算的。google
例如:我00秒的時候使用chrome訪問過www.google.com.hk,此時瀏覽器DNS緩存產生,而後我修改了hosts文件,將www.google.com.hk指向本地127.0.0.1,而後在05秒的時候嘗試再次訪問這個地址,由於瀏覽器DNS緩存未過時,因此hosts修改沒法體現出來。url
另外一種狀況下,我好久都沒有訪問www.baidu.com了,而後我修改了hosts文件,將其指向127.0.0.1,這時由於瀏覽器沒有DNS緩存,因此會查詢操做系統中的DNS緩存,結果此時hosts文件生效!
前面也提到,Safari的瀏覽器DNS緩存時間大約爲10秒,因此通常調試程序的時候,不少人都習慣修改hosts後,用Safari來調試,由於大部分狀況下,修改hosts以後,瀏覽器DNS緩存已經失效了。
那麼怎麼主動清除瀏覽器DNS緩存呢?博主目前也沒有找到辦法,測試過Chrome下的「清除緩存」選項,發現沒有起到指望的效果。
那麼,就請在修改hosts以後,耐下心來,稍等幾十秒吧。
最後打個廣告,博主正在開發一款比修改hosts更方便的DNS更改工具,應該可以在新年推出,敬請期待!