The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

在開發時期如何有效避免 Internet Explorer 對網址進行快取

我們在開發網站應用程式的時候,有時後需要模擬特定網址進行操作,模擬的過程中通常都是透過修改系統的 hosts 檔案來指定特定網址所對應的 IP 位址 (開發環境下的主機 IP 位址) 以便於進行測試,但是在使用 Internet Explorer 進行測試時經常會遇到 DNS 被快取的狀況,而我這裡提到的是 IE 內建的 DNS 快取機制,並非系統的 DNS 快取機制,因此並無法透過 ipconfig /flushdns 指令來清空快取。

這問題我不知道多少人有機會遇到,因為我正在處理的一個專案剛好用到 ActiveX 元件,而且還會鎖定特定網域才能使用,因此經常要在同一個網址下來測試正式機與測試機,有時後一天還要切換好幾次,但每次修改完 hosts 檔案後 IE 都還是會快取住之前連接過的 Domain Name,即便你把 IE 完整關閉後重開依然被快取住,通常都要至少等個幾十秒到幾分鐘 IE 才能感應到我已經修改過 hosts 檔案,這時我才能把網址快速的切換過去。注意:此問題只會發生在使用 IE 瀏覽器的時候,其他版本瀏覽器無此問題。

如果只是本機的 DNS 快取問題,我們可以透過以下指令就能將快取住的 DNS 清空:

ipconfig /flushdns

指令執行完後,本機的 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 進行快取了。

相關連結