瀏覽器DNS快取機制分析

2021-06-16 14:15:54 字數 1480 閱讀 8076

經常做web開發的工程師,都會遇到需要將某個網域名稱繫結到特定ip上,進行測試的情況。大家一般都會用修改hosts檔案的方式來解決,但是經常也會遇到修改hosts不生效的情況,而且有時生效,有時不生效的情況也有發生,這到底是為什麼呢?

簡單來說,一條網域名稱的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秒。

那麼在修改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之後,耐下心來,稍等幾十秒吧。

最後打個廣告,博主正在開發一款比修改hosts更方便的dns更改工具,應該能夠在新年推出,敬請期待!

瀏覽器快取機制

最近在準備優化日誌請求時遇到了一些令人疑惑的問題,比如為什麼響應頭里出現了兩個 cache control 為什麼明明設定了 no cache 卻還是發請求,為什麼多次訪問時有時請求裡帶了 etag,有時又沒有帶?等等。後來查了一些資料以及同事親自驗證,總算對這些問題有了個清晰的理解,現在整理出來以...

瀏覽器快取機制

當我們瀏覽乙個頁面發現有異常時,通常考慮的就是書不是瀏覽器做了快取呢,按ctrl f5重新請求一次就能請求到沒有快取的頁面,這個是為什麼呢。首先,ctrl f5組合鍵重新整理頁面,那麼瀏覽器會直接向目標url傳送請求,而不再使用瀏覽器快取的資料。其次,當請求到達伺服器端依然有可能出現使用伺服器端的資...

瀏覽器快取機制

瀏覽器快取機制 瀏覽器快取機制,其實主要就是 協議定義的快取機制 如 expires cache control 等 但是也有非 協議定義的快取機制,如使用 html meta 標籤,web 開發者可以在 html 頁面的節點中加入 標籤,如下 上述 的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需...