通過設置hosts文件可以強制指定域名對應的IP,當修改hosts文件,想要瀏覽器生效,最直接的方法關閉瀏覽器后重新開啟;如果不想重啟瀏覽器,只需要清空瀏覽器的DNS緩存即可。清空DNS緩存在chrome、firefox下很容易做到。具體操作如下:
chrome:在瀏覽器的地址欄中輸入 chrome://net-internals/#dns 並回車,該頁面會顯示當前所有DNS緩存,通過點擊“Clear host cache”,可以清空所有DNS緩存。有時候此方法可能不能立刻生效,可以使用另外一個設置,在地址欄中輸入 chrome://settings/ 並回車,通過搜索“預測網絡操作”找到配置項“預測網絡操作,以提高網頁加載速度”,去掉前面的勾即可。
firefox:在地址欄中 about:config 並回車,可能會出現一個警告信息,直接點擊按鈕進入,會出現firefox的所有配置信息,通過搜索dns進行過濾,可以看到一項名為 network.dnsCacheExpirationGracePeriod 項,它對應的值就是DNS緩存的時間,雙擊此項,會出現修改的提示框,填入 0 (不緩存DNS)即可。
緣起。。。惱火。。。
各大瀏覽器默認開啟了DNS緩存功能,所以在先訪問有個不存在域名后,再把該域名添加到本地hosts文件指向本地后,用該瀏覽器訪問依然會提示域名不存在。。。
解決方案:
Firefox解決方式:
Firefox有dns緩存功能,但是默認緩存時間只有1分鍾,可以通過修改該默認值加快DNS解析速度,方法如下:
打開一個新的窗口,地址欄輸 入 about:config,回車,進入設置界面。然后搜索 network.dnsCacheExpiration ,把原來的60改成 6000(表示緩存6000秒),再搜索network.dnsCacheEntries 把默認的20改成1000(表示緩存1000條)。如果沒 有上面兩個項目,新建它們即可,新建條目類型為整數型。 當然也可以按照需要設置成其它的值。
但是dns緩存太久了也會出問題,比如有的網站ip換了,就無法訪問了。
針對這樣的問題,還可以安裝一個 firefox 插件來開啟或者 關閉dns cache功能,https://addons.mozilla.org/zh-CN/firefox/addon/5914 。
IE解決方式:
禁用DNS緩存的方法,將下面內容保存為注冊表文件,在運行寫入注冊表:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=dword:00000000
"DnsCacheTimeout"=dword:00000000
"ServerInfoTimeOut"=dword:00000000
寫入注冊表以后IE將不再緩存DNS,我們對hosts便會立即生效,無需再重啟瀏覽器。
如果需要恢復IE的DNS緩存,只需清楚我們之前寫入的注冊表內容。跟上面的方法一樣:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=-
"DnsCacheTimeout"=-
"ServerInfoTimeOut"=-
Chrome瀏覽器:
為了加快訪問速度,Google Chrome瀏覽器采用了預提DNS記錄,在本地建立DNS緩存的方法,加快網站的連接速度。你在谷歌Chrome瀏覽器的地址欄中輸入about:DNS,回車,就可以看到本地的DNS緩存。
firefox下有個DNS Flusher插件,但沒有chrome版本,其實在chrome下清除DNS緩存非常簡單:
1、用chrome打開:chrome://net-internals/#dns
2、點擊上面的“clean host cache”
也可以清空在工具中選擇清空Cache,這樣DNS cache會一同清空。
微軟windows下如何清空dns
在微軟windows下,你可以用命令ipconfig /flushd ns來清空dns 緩存內容。
你也可以用命令ipconfig /displaydns 來查看dns緩存內容。
Mac OSX下如何清空dns緩存
在Mac OSX中,你可以用這個命令lookupd -flushcache 來清空保留的緩存。
bash-2.05a$ lookupd -flushcache
Linux 下如何清空dns緩存
在linux中,nscd進程負責管理DNS緩存。
要清空DNS緩存,重啟nscd守護進程就行了。
要重啟nscd進程,使用命令(不帶引號)'/etc/rc.d/init.d/nscd restart '
經常做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:
后來我也做過測試,Mac下Chrome(23.0.1271.101)的DNS緩存時間是1分鍾。Safari下DNS緩存時間大約為10秒。
解:hosts文件修改的原理
那么在修改hosts文件之后,發生了什么事情呢?這里不妨先提提Chrome下的一個工具:chrome://net-internals/#dns。這里列出了目前系統中的DNS緩存和Chrome中使用的情況。通過這個工具,可以看到:
1 |
**在修改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更改工具,應該能夠在新年推出,敬請期待!