我們在開發網站應用程式的時候,有時後需要模擬特定網址進行操作,模擬的過程中通常都是透過修改系統的 hosts 檔案來指定特定網址所對應的 IP 位址 (開發環境下的主機 IP 位址) 以便於進行測試,但是在使用 Internet Explorer 進行測試時經常會遇到 DNS 被快取的狀況,而我這裡提到的是 IE 內建的 DNS 快取機制,並非系統的 DNS 快取機制,因此並無法透過 ipconfig /flushdns 指令來清空快取。
這問題我不知道多少人有機會遇到,因為我正在處理的一個專案剛好用到 ActiveX 元件,而且還會鎖定特定網域才能使用,因此經常要在同一個網址下來測試正式機與測試機,有時後一天還要切換好幾次,但每次修改完 hosts 檔案後 IE 都還是會快取住之前連接過的 Domain Name,即便你把 IE 完整關閉後重開依然被快取住,通常都要至少等個幾十秒到幾分鐘 IE 才能感應到我已經修改過 hosts 檔案,這時我才能把網址快速的切換過去。注意:此問題只會發生在使用 IE 瀏覽器的時候,其他版本瀏覽器無此問題。
如果只是本機的 DNS 快取問題,我們可以透過以下指令就能將快取住的 DNS 清空:
指令執行完後,本機的 DNS 快取記錄就會被清空,這時任何應用程式要查詢 DNS 時就會重新向本機網路設定指定的 Name Server 進行查詢。不過,一個鮮為人知的秘密就是 IE 其實自己還內建一個 DNS 快取機制,所以就算你將本機系統的 DNS 快取清除,其實在 IE 內還有一份快取,而這份快取幾乎是無法透過任何指令操作的,此問題困擾我多年,直到最近透過微軟技術支援中心的協助才得以解決。
為了解決在開發時期 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
另外我再提供透過 reg.exe 設定的指令如下:
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "DnsCacheEnabled" /t REG_DWORD /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "DnsCacheTimeout" /t REG_DWORD /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ServerInfoTimeOut" /t REG_DWORD /d 0 /f
如果你想要回覆預設值,只要將這三個機碼移除即可:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=-
"DnsCacheTimeout"=-
"ServerInfoTimeOut"=-
以下是透過 reg.exe 指令的語法:
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "DnsCacheEnabled" /f
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "DnsCacheTimeout" /f
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ServerInfoTimeOut" /f
這三個機碼 ( DnsCacheEnabled, DnsCacheTimeout, ServerInfoTimeOut ) 你用 regedit 是找不到的,所以必須手動新增這三個機碼才行,加入後設定立即生效,且 IE 也就不會再對任何 DNS 進行快取了。
相關連結