2013-04-23 38 views
11

即使我發送「緩存控制:必須重新驗證」Google Chrome瀏覽器中使用來回按鈕時,會使用本地緩存頁面。谷歌瀏覽器並不會重新驗證etag的來回

原來這是響應的一部分:

HTTP/1.1 200 OK 
cache-control: private, must-revalidate 
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e" 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

如果我刷新頁面,我收到了「HTTP/1.1 304未修改」響應,但是當我使用後退按鈕,我得到如下回應:

Request URL:example.com 
Request Method:GET 
Status Code:200 OK (from cache) 

我在找的迴應是304或200好,是否有可能實現這個目標?

回答

13

當使用後退和前進按鈕,關鍵Cache-Control指令,以防止瀏覽器返回的頁面的緩存副本是no-store

沒有別的會幫助,沒有別的是必要的。您的Cache-Control標題可以簡單地爲:

Cache-Control: no-store 

雖然有兩個例外。

  1. 無論您設置什麼標題(至少是我測試過的版本),Opera和Safari都不會重新驗證。如果您在新選項卡中打開該頁面,該副本將是新鮮的,但原始選項卡會在來回導航時繼續顯示過時版本,直到您刷新或重新輸入網址。
  2. Firefox在打開的第一頁的緩存中(即沒有後退按鈕時)似乎有一個錯誤。所有後續的頁面實例將在您前後導航時刷新,但一旦您備份到最頂端的頁面,它通常仍會顯示其初始舊副本。

最後,我應該注意,使用這個指令通常是不可取的,因爲它顯然對帶寬使用有顯着的影響。瀏覽器甚至無法利用Etags獲得304 Not Modified響應,因爲在收到304響應的情況下,它將沒有存儲的副本用於使用。

+1

所以基本上如果你想讓後/前按鈕工作,你不能利用etags? – Dennis 2013-05-12 23:01:04

+1

是的。這是我在所有測試中發現的。 – 2013-05-12 23:25:44

+0

http://madhatted.com/2013/6/16/you-do-not-understand-browser-history包含了一個有趣的情況討論。 – Gili 2014-05-17 05:08:23

3

「必須重新驗證」指令僅在響應失效後適用(RFC2616, sec 14.9.4)。由於響應既不包含「Expires」標題也不包含「max-age」指令,因此瀏覽器可能會將響應視爲仍然新鮮,並相應地返回緩存副本。爲了防止出現這種情況,您應該在Cache-Control標頭中包含「max-age:0」(可能還有一個Expires標頭,其中包含過去的日期),以便緩存的響應立即變爲陳舊。或者,爲了防止緩存,請使用「no-cache」指令而不是「must-revalidate」。

+1

從RFC2616的13.2.4開始:「max-age指令優先於Expires」。你不需要兩個。在任何情況下,這些都不會阻止瀏覽器在使用後退按鈕進行導航時顯示過時的副本。 – 2013-05-12 11:55:35

+0

我剛剛確認James的評論,該解決方案不適用於後退按鈕。 – Dennis 2013-05-12 22:58:14

2

no-store緩存指令可用於指示瀏覽器不要將頁面寫入磁盤緩存。結合no-cache這應該確保所有瀏覽器都會從上游獲取資源,而不是從磁盤獲取資源。

Cache-Control: private, no-cache, no-store

+0

除了我希望瀏覽器在來回導航時重新驗證etag。 – Dennis 2013-05-12 23:07:55

+2

這會違反RFC2616第13.13節(http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html),它指定瀏覽器不應該重新驗證:「歷史機制和緩存是不同的,特別是歷史記錄機制不應該嘗試以顯示資源當前狀態的語義透明視圖,而歷史機制則意味着準確顯示用戶在檢索資源時看到的內容。「不重新驗證或獲取通過後退按鈕訪問的過期頁面的瀏覽器實際上正在做正確的事情 - 這不正是你想要的。 – SpliFF 2013-05-14 04:56:01

+1

只有'no-store'可以工作,因爲瀏覽器沒有選擇,它沒有本地副本顯示,所以它必須向上遊獲取它。 – SpliFF 2013-05-14 04:57:32