我一直在嘗試刷新我對HTTP/1.1緩存的理解 - 我發現我必須每隔一段時間做一次,因爲似乎有太多可能的組合讓我的大腦可靠地記住。瀏覽器何時刷新陳舊的緩存條目?
我就把它作爲鑑於Expires
或max-age
高速緩存控制指令是使用瀏覽器作爲提示,不是鐵定的規律:如果一個緩存條目是陳舊(比其最大年齡大),瀏覽器可以驗證它。
一位同事和我有一點關於這一點,他強迫我閱讀RFC,我覺得這有點嚴厲,但證明他是完全正確的:如果我的理解正確,客戶端不允許使用一個他們知道陳舊的緩存條目。換句話說:如果文檔指定了max-age
緩存標頭,並且沒有其他指令(如must-validate
)影響緩存行爲,並且該文檔的緩存條目變得陳舊,那麼瀏覽器將始終重新驗證它。
這是完全清晰的邏輯,並把這樣的說法來休息,我開始由具有服務器憑經驗確認服務測試JavaScript文件具有以下標題:
< HTTP/1.1 200 OK
< Content-Type: application/x-javascript; charset=UTF-8
< Cache-Control: public, max-age=30
< Date: Thu, 30 Jan 2014 22:11:28 GMT
< Accept-Ranges: bytes
< Server: testServer/1.0
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
這個JavaScript文件包含在文檔的<head>
中通過<script>
元素託管在同一服務器上的HTML頁面中。在HTML頁面送達下列緩存控制標題:
Cache-Control: no-cache, must-revalidate, no-store, max-age=0
加載HTML網頁後,我經歷到不同的頁面點擊,等待5分鐘,好措施,並點擊一個鏈接就回到原來的頁面,監視所有HTTP請求 - 並且測試文件從未被請求過。這與Firefox和Safari的最新版本一致。
這有點冗長,但我的問題的要點是:我的測試似乎表明,主流瀏覽器不尊重RFC並且不會重新驗證陳舊的緩存條目。我誤解了RFC嗎?同樣可能,我是否弄錯了我的測試,並且有人能證明他們錯了嗎?或者瀏覽器真的不尊重max-age
緩存指令?
'HTTP/1.0'或'HTTP/1.1'?我和你在一起,順便說一句,我不認爲瀏覽器會遵從RFC中的MUST要求...... – Wrikken
好的,謝謝。我編輯了這個問題來指定'HTTP/1.1'。 –
你如何讓瀏覽器請求這個文件,你是否將它用作HTML文檔中腳本標記的源代碼?該文檔提供了哪些緩存標題? 「導航離開並回來」是什麼意思,(如何)刷新包含頁面? – CodeCaster