經過設置hosts文件能夠強制指定域名對應的IP,當修改hosts文件,想要瀏覽器生效,最直接的方法關閉瀏覽器後從新開啓;若是不想重啓瀏覽器,只須要清空瀏覽器的DNS緩存便可。清空DNS緩存在chrome、firefox下很容易作到。具體操做以下:linux
chrome:在瀏覽器的地址欄中輸入 chrome://net-internals/#dns 並回車,該頁面會顯示當前全部DNS緩存,經過點擊「Clear host cache」,能夠清空全部DNS緩存。有時候此方法可能不能馬上生效,可使用另一個設置,在地址欄中輸入 chrome://settings/ 並回車,經過搜索「預測網絡操做」找到配置項「預測網絡操做,以提升網頁加載速度」,去掉前面的勾便可。web
firefox:在地址欄中 about:config 並回車,可能會出現一個警告信息,直接點擊按鈕進入,會出現firefox的全部配置信息,經過搜索dns進行過濾,能夠看到一項名爲 network.dnsCacheExpirationGracePeriod 項,它對應的值就是DNS緩存的時間,雙擊此項,會出現修改的提示框,填入 0 (不緩存DNS)便可。chrome
緣起。。。惱火。。。windows
各大瀏覽器默認開啓了DNS緩存功能,因此在先訪問有個不存在域名後,再把該域名添加到本地hosts文件指向本地後,用該瀏覽器訪問依然會提示域名不存在。。。瀏覽器
解決方案:緩存
Firefox解決方式:bash
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緩存的方法,將下面內容保存爲註冊表文件,在運行寫入註冊表:app
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緩存很是簡單:
一、用chrome打開:chrome://net-internals/#dns
二、點擊上面的「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緩存的機制,有一篇很是詳細的文章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文件以後,發生了什麼事情呢?這裏不妨先提提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更改工具,應該可以在新年推出,敬請期待!