如何在 Internet Explorer 中防止快取
警告
已淘汰、不受支援的 Internet Explorer 11 傳統型應用程式已於特定 Windows 10 版本透過 Microsoft Edge 更新永久停用。 如需詳細資訊,請參閱 Internet Explorer 11 傳統型應用程式淘汰常見問題集 (英文)。
本文說明使用 HTTP 標頭來控制 Internet Explorer 中網頁的快取。
原始產品版本: Internet Explorer
原始 KB 編號: 234067
摘要
您可以使用 Microsoft Internet Information Server (IIS),在特定 Active Server 頁面 (ASP) 頁面的極端開頭,使用下列腳本輕鬆地標示高度揮發性或敏感性頁面:
<% Response.CacheControl = "no-cache" %>
<% Response.AddHeader "Pragma", "no-cache" %>
<% Response.Expires = -1 %>
到期日和到期標頭
強烈建議所有網頁伺服器使用配置來到期所有網頁。 Web 伺服器無法透過 HTTP Expires 回應標頭提供到期資訊給傳回給要求用戶端的每個資源,這是錯誤的作法。 現今大部分的瀏覽器和中繼 Proxy 都遵守這項到期資訊,並用它來提升透過網路通訊的效率。
一律使用 Expires 標頭來指定用戶端需要更新伺服器上特定檔案的最合理時間。 當頁面定期更新時,更新的下一個期間是最有效率的回應。 例如,在每天上午 5 點更新的因特網上的每日新聞頁面。此新聞頁面的網頁伺服器應該會在第二天傳回值為 5 A.M 的 Expires 標頭。 完成後,瀏覽器不需要再次連絡網頁伺服器,直到頁面變更為止。
預計不會變更的頁面應該標示大約一年的到期日。
在許多情況下,網頁伺服器在伺服器上有一或多個變動性頁面,其中包含可能立即變更的資訊。 這些頁面應該由伺服器標記,其值為 “-1” 的Expires標頭。 在用戶未來的要求時,Internet Explorer 通常會透過條件式 If-Modified-Since 要求連絡網頁伺服器以更新該頁面。 不過,頁面會保留在磁碟快取中(暫存因特網檔案)。 而且頁面會在適當情況下使用,而不需要連絡遠端 Web 伺服器,例如:
- 當 BACK 和 FORWARD 按鈕用來存取瀏覽歷程記錄時。
- 當瀏覽器處於離線模式時。
Cache-Control 標頭
不過,某些頁面會如此揮發性或敏感性,因此不需要磁碟快取。 為此,Internet Explorer 支援 HTTP 1.1 Cache-Control 標頭。 當 HTTP 1.1 伺服器指定無快取值時,此標頭會防止特定 Web 資源的所有快取。
除非瀏覽器可以重新處理網頁伺服器,否則無法存取從快取中保留的頁面。 因此,伺服器應該謹慎使用 Cache-Control 標頭。 在大部分情況下,偏好使用Expires: -1。
Pragma:No-Cache 標頭
不幸的是,舊版 HTTP 1.0 伺服器無法使用 Cache-Control 標頭。 為了與 HTTP 1.0 伺服器的回溯相容性,Internet Explorer 支援 HTTP Pragma:no-cache 標頭的特殊用法。 如果用戶端透過安全連線 (https://
) 與伺服器通訊,而且伺服器會傳回具有回應的 Pragma:no-cache 標頭,Internet Explorer 不會快取回應。
不過,Pragma:無快取標頭並非基於此目的。 根據 HTTP 1.0 和 1.1 規格,此標頭只會在要求的內容中定義,而不是回應。 它適用於可能會防止某些重要要求到達目的地 Web 伺服器的 Proxy 伺服器。 對於未來的應用程式,Cache-Control 標頭是控制快取的適當方法。
HTTP-EQUIV META 標記
HTML 頁面允許META標記的特殊 HTTP-EQUIV形式,指定HTML檔中的特定 HTTP 標頭。 以下是使用 Pragma:no-cache 和 Expires: -1 的簡短範例 HTML 頁面:
<HTML>
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
</HEAD>
<BODY>
</BODY>
</HTML>
Pragma:no-cache 只會防止在透過安全連線使用時進行快取。 Pragma:no-cache META 標籤標的處理方式與到期日相同: -1,如果用於非安全頁面。 頁面將會快取,但標示為立即過期。
Cache-Control META HTTP-EQUIV 標籤會被忽略,且在 Internet Explorer 第 4 版或 5 版中沒有任何作用。 若要使用 Cache-Control,必須使用 HTTP 標頭來指定此標頭,如上述 Cache-Control 一節所述。
注意
標準 HTTP 標頭的使用比 META 標記更慣用。 META 標記通常必須出現在 HTML HEAD 區段頂端。 而且 Pragma HTTP-EQUIV META 標記至少有一個已知問題。
快取的伺服器選項
當非 ASP 頁面上需要使用 Cache-Control 標頭時,可能需要使用伺服器組態中的選項來自動新增此標頭。 如需將 HTTP 標頭新增至特定目錄之伺服器回應的程式,請參閱您的伺服器檔。 例如,在 IIS 4 中,請遵循下列步驟:
- 啟動 IIS 管理員。
- 在計算機和服務樹狀目錄中,開啟預設網頁伺服器或有問題的網頁伺服器。 尋找包含需要 Cache-Control 標頭內容的目錄。
- 開啟該目錄的 [ 屬性 ] 對話框。
- 選取 [ HTTP 標頭] 索引標籤 。
- 選取 [自定義 HTTP 標頭] 群組中的 [ 新增 ] 按鈕,然後針對標頭名稱新增 Cache-Control,並針對標頭值新增無快取。
在整個 Web 伺服器上全域使用此標頭並不是個好主意。 將它純粹的使用限制為絕對不能在用戶端上快取的內容。
問題檢查清單
如果您已套用本文中的技術,但仍有快取和 Internet Explorer 的問題,請先檢閱此方便的檢查清單,再連絡Microsoft以取得技術支持協助:
- 您是否使用 Cache-Control 標頭搭配 ASP
Response.CacheControl
屬性或透過傳回的 HTTP 標頭? 這是真正防止 Internet Explorer 中快取的唯一方法。 - 您是否使用 Internet Explorer 4.01 Service Pack 2 或更高版本? 無法完全防止在舊版瀏覽器中快取。
- 您是否仔細檢查 Web 伺服器是否已開啟 HTTP 1.1,並傳回對 Internet Explorer 的 HTTP 1.1 回應? HTTP 1.0 回應中的快取控制標頭無效。
- 如果您在伺服器端使用 CGI/ISAPI/Servlet,是否確實遵循 HTTP 1.1 規格,特別是關於 HTTP 標頭的 CRLF 終止? 為了達到效能,Internet Explorer 通常不會違反 HTTP 1.1 規格的回應。 它通常會導致忽略的標頭或未預期的伺服器錯誤報告。
- HTTP 標頭拼字是否正確?
另請參閱
- 如需 HTTP 1.1 通訊協定的詳細資訊,請參閱此外部連結: RFC 2616。
- IIS 中的用戶端快取