Http

為什麼這個 HTTP 頭配置會導致瀏覽器總是執行 If-Modified-Since 請求?

  • May 8, 2013

在我們的伺服器上,我們配置了 http 響應標頭,如下所示:

Cache-Control:max-age=28800, must-revalidate   # (8 hours)
Connection:Keep-Alive
Date:Wed, 24 Apr 2013 21:36:19 GMT
ETag:W/"173520-1366833451000"
Expires:Thu, 25 Apr 2013 05:36:19 GMT          # (8 hours from access)
Keep-Alive:timeout=15, max=484
Server:Apache-Coyote/1.1
Vary:Accept-Encoding,User-Agent

我們的目的是讓瀏覽器記憶體資源 8 小時,之後瀏覽器應該304在使用記憶體副本之前檢查它是否已被修改(通過請求)。

但是,我發現瀏覽器總是會生成304. (它繼續使用它的記憶體副本,但在這樣做之前檢查伺服器是否有修改 - 我希望在 8 小時後發生,而不是一直發生。)

正如我認為它應該工作的那樣,Cache-Control:max-age=28800, must-revalidate應該指示客戶端使用記憶體的資源,直到它到達max-age記憶體中,然後它must-revalidate與源伺服器一起使用。我相信該Expires指令更多的是一種備份,並且Cache-Control取代的是 - 但如果它正在發揮作用,我希望瀏覽器在到期日期之前使用記憶體的副本,然後獲取一個新副本。其中大部分內容是從這篇文章中收集的,並稍微仔細閱讀了規範。

顯然,我的理解是不完整的——我錯過了什麼?

**編輯:**我錯誤地認為通過刷新目前頁面我將測試當瀏覽器轉到具有相同資源連結的後續頁面時會發生什麼。我錯了——點擊“刷新”按鈕通常似乎會強制瀏覽器在使用記憶體副本之前檢查是否有任何資源被修改,這非常明顯。當我點擊其他頁面時,資源會按預期直接從記憶體中提取。

這是專門針對瀏覽器重新載入按鈕的所需行為。重新載入按鈕將嘗試驗證頁面以及 CSS 等一些內容。

還有其他載入頁面的方法,例如導航離開和返回。或者在這種情況下點擊 URL 欄並點擊“輸入”,瀏覽器將使用記憶體的數據而無需重新驗證。

引用自:https://serverfault.com/questions/502409