37

緩存控制頭「no-cache,must-revalidate,private」允許瀏覽器緩存資源,但強制使用條件請求進行重新驗證。這在FF,Safari和Chrome中按預期工作。使IE緩存資源,但總是重新驗證

但是,IE7 + 8不發送條件請求,即請求頭中缺少「If-Modified-Since」,因此服務器使用HTTP/200而不是HTTP/304進行響應。

這裏有完整的服務器響應標題:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT 
Content-type: text/html;charset=utf-8 
Content-Length: 10835 
Date: Wed, 16 Feb 2011 13:52:26 GMT 
Connection: keep-alive 
Cache-Control: no-cache, must-revalidate, private 

這似乎是一個IE瀏覽器的bug,但我還沒有在網上找到相關的東西,所以我不知道是否有另一個頭的也許不存在或存在使IE看起來很奇怪?

無緩存和最大年齡的區別的一個很好的討論:What's the difference between Cache-Control: max-age=0 and no-cache?

+0

進入Internet選項==>常規選項卡==>瀏覽歷史記錄部分==>設置...按鈕。看看「檢查存儲頁面的更新版本:」選擇器。確認此緩存行爲是否與其設置相關聯(對於大多數用戶而言,它應該是自動的)。 – rskar 2011-02-16 14:43:53

+1

它不**與此行爲相關聯。 – alienhard 2011-02-16 17:17:01

回答

66

我終於想通了。這是一個解釋和測試解決方案。

以下網站證實了我的看法:http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

它說,IE瀏覽器在本地不保存的頁面與「無緩存」指令,因此始終將無條件請求。

還有一個MS支持文章 - https://support.microsoft.com/help/234067/ - 這證實了這一點:

「Internet Explorer支持的HTTP 1.1 Cache-Control頭,指定無緩存值時,防止特定的Web資源的所有緩存...「

此行爲並非完全錯誤 - 但它不是RFC 2616(第14.9.1節)的意圖。關於'no-cache'它說:「......一個緩存不能使用該響應來滿足後續請求,而不需要使用原始服務器成功重新驗證。」所以響應可以被緩存,但必須重新驗證它。除IE以外的主要瀏覽器都會緩存響應並對其進行重新驗證。爲了防止存儲請求,有'無存儲'緩存控制指令。

總之,IE將'no-cache'視爲'no-store'。

而這裏的解決方案來實現對IE和其他瀏覽器條件請求以一致的方式:

不要使用無緩存,而是設置Expires頭過去(或 - 1,具有相同的效果)。 IE以及其他主要瀏覽器將發送條件請求。 (注意,你也應該知道IE Vary頭部錯誤,它可以防止緩存。)

這些都是關鍵的報頭字段:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT 
Expires: -1 
Cache-Control: must-revalidate, private 
  • 上次修改(或ETag的)需要作爲驗證
  • 過期-1告訴該資源是過時並且必須重新驗證
  • 的Cache-Control不得包括無緩存或無店鋪
-2
$last_modified = filemtime($_SERVER['SCRIPT_FILENAME']); 

    session_cache_limiter(FALSE); 

    header("Content-Type: text/css"); 
    header("Cache-Control: max-age=1, must-revalidate, private"); 
    header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified) . " GMT"); 

    if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) 
    { 
     if(strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $last_modified) 
     { 
     header("HTTP/1.1 304 Not Modified"); 
     exit; 
     } 
    }