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

我們在開發網站應用程式的時候，有時後需要模擬特定網址進行操作，模擬的過程中通常都是透過修改系統的 [hosts 檔案](http://zh.wikipedia.org/zh-tw/Hosts%E6%96%87%E4%BB%B6)來指定**特定網址**所對應的 **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 進行快取了。

**相關連結**

-   [How to change the default keep-alive time-out value in Internet Explorer](http://support.microsoft.com/kb/813827/en-us)
-   [How Internet Explorer uses the cache for DNS host entries](http://support.microsoft.com/kb/263558/en-us)
-   [Internet Explorer 如何使用 DNS 主機項目的快取](http://support.microsoft.com/kb/263558)
-   [DNS Caching in Internet Explorer](http://www.itsyourip.com/dns/dns-caching-in-internet-explorer/)
