如何在 Internet Explorer 中防止快取

警告

已淘汰、不受支援的 Internet Explorer 11 傳統型應用程式已於特定 Windows 10 版本透過 Microsoft Edge 更新永久停用。 如需詳細資訊,請參閱 Internet Explorer 11 傳統型應用程式淘汰常見問題集 (英文)。

本文說明如何使用 HTTP 標頭來控制 Internet Explorer 中網頁的快取。

原始產品版本: Ie
原始 KB 編號: 234067

摘要

您可以使用 Microsoft Internet Information Server (IIS) ,在特定 Active Server Pages (ASP) 頁面的極端開頭,使用下列腳本輕鬆地標記高度變動或敏感性頁面:

<% Response.CacheControl = "no-cache" %>
<% Response.AddHeader "Pragma", "no-cache" %>
<% Response.Expires = -1 %>

到期和 Expires 標頭

強烈建議所有網頁伺服器都使用配置來到期所有網頁。 Web 伺服器不透過 HTTP Expires 回應標頭,針對每個傳回給要求客戶端的資源提供到期資訊是一個不良的做法。 現今大部分的瀏覽器和中繼 Proxy 都遵守此到期資訊,並使用此資訊來提高透過網路的通訊效率。

一律使用 Expires 標頭來指定用戶端需要更新伺服器上特定檔案的最合理時間。 定期更新頁面時,更新的下一個期間是最有效率的回應。 例如,採用因特網上每天上午 5 點更新的每日新聞頁面。此新聞頁面的網頁伺服器應該會傳回值為 5.M.2.1 的 Expires 標頭。 完成後,瀏覽器就不需要再次連絡網頁伺服器,直到頁面變更為止。

預期不會變更的頁面應該以大約一年的到期日標示。

在許多情況下,網頁伺服器的伺服器上會有一或多個動態頁面,其中包含可能會立即變更的資訊。 這些頁面應該由伺服器標示,且 Expires 標頭的值為 “-1”。 在用戶未來的要求中,Internet Explorer 通常會透過條件式 If-Modified-Since 要求,連絡網頁伺服器以取得該頁面的更新。 不過,頁面會保留在 [暫存因特網檔案]) (磁盘快取中。 而且頁面會在適當的情況下使用,而不需要連絡遠端 Web 伺服器,例如:

  • 當 [上一頁] 和 [轉寄] 按鈕用來存取瀏覽歷程記錄時。
  • 當瀏覽器處於離線模式時。

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: 無快取標頭與回應,Internet Explorer 就不會快取回應。

不過,Pragma: no-cache 標頭不適用於此目的。 根據 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:只有透過安全連線使用時,無快取才會防止快取。 Pragma:如果在不安全的頁面中使用,則會將無快取 META 標記視為與 Expires: -1 相同。 頁面將會快取,但標示為立即過期。

Cache-Control 會忽略META HTTP-EQUIV標籤,而且在Internet Explorer 第4或5版中沒有任何作用。 若要使用 Cache-Control,必須使用 HTTP 標頭來指定此標頭,如上 Cache-Control 一節中所述。

注意事項

標準 HTTP 標頭的使用比 META 標籤更慣用。 META 標籤通常必須出現在 HTML HEAD 區段的頂端。 而且 Pragma HTTP-EQUIV META 標籤至少有一個已知問題。

快取的伺服器選項

當 Cache-Control 標頭需要用於非 ASP 頁面時,可能需要使用伺服器組態中的選項來自動新增此標頭。 如需將 HTTP 標頭新增至特定目錄之伺服器回應的程式,請參閱您的伺服器檔。 例如,在 IIS 4 中,請遵循下列步驟:

  1. 啟動 IIS 管理員。
  2. 在計算機和服務樹狀目錄中,開啟 [預設網頁伺服器] 或 [有問題的網頁伺服器]。 尋找包含需要 Cache-Control 標頭之內容的目錄。
  3. 開啟該目錄的 [ 屬性 ] 對話框。
  4. 選取 [HTTP 標頭] 索引標籤
  5. 選取 [自定義 HTTP 標頭] 群組中的 [ 新增 ] 按鈕,然後針對標頭名稱新增 Cache-Control,併為標頭值新增無快取。

在整個 Web 伺服器上全域使用此標頭不是很好的做法。 僅限使用絕對不得在用戶端上快取的內容。

問題檢查清單

如果您已套用本文中的技術,但仍有快取和 Internet Explorer 的問題,請在連絡 Microsoft 以取得技術支持協助之前,逐步檢閱此方便的檢查清單:

  • 您是使用 Cache-Control 標頭搭配 ASP Response.CacheControl 屬性還是透過傳回的 HTTP 標頭? 這是在 Internet Explorer 中真正防止快取的唯一方法。
  • 您使用 Internet Explorer 4.01 Service Pack 2 或更新版本嗎? 無法完全防止在舊版瀏覽器中快取。
  • 您是否已再次檢查您的網頁伺服器是否已開啟 HTTP 1.1,並且正在將 HTTP 1.1 回應傳回 Internet Explorer? Cache-Control 標頭在 HTTP 1.0 回應中無效。
  • 如果您在伺服器端使用 CGI/ISAPI/Servlets,您是否完全遵循 HTTP 1.1 規格,特別是關於 HTTP 標頭的 CRLF 終止? 為了提高效能,Internet Explorer 通常不會收到違反 HTTP 1.1 規格的回應。 通常會導致忽略標頭或報告非預期的伺服器錯誤。
  • HTTP 標頭拼字是否正確?

另請參閱