原文鏈接:瀏覽器緩存
瀏覽器緩存
強緩存 & 協商緩存
-
強緩存
釋義: 客戶端第一次問服務器要某個資源時,服務器丟還給客戶端所請求的這個資源同時,告訴客戶端將這個資源保存在本地,並且在未來的某個時點之前如果還需要這個資源,直接從本地獲取就行了,不用向服務器請求.這種方式緩存下來的資源稱爲強緩存.Expires
&Cache-Control:max-age
-
Expires:
該字段是http1.0時的規範,值爲一個絕對時間的GMT格式的時間字符串,代表緩存資源的過期時間,在這個時點之前,即命中緩存. -
Cache-Control:
該字段是http1.0時的規範,值爲一個絕對時間的GMT格式的時間字符串,代表緩存資源的過期時間,在這個時點之前,即命中緩存.
參數:no-cache
: 如果請求頭部包含no-cache指令,表示客戶端不接收緩存過的響應.中間緩存服務器必須將請求轉發給給源服務器. 瀏覽器強制刷新(window下ctrl+F5)就是這個原理,所以的請求都設置no-cacheno-store
: 暗示請求和響應包含機密信息,不能進行緩存.
區分: no-store纔是真正的不緩存max-age
: 該指令用來標識緩存資源的最大有效期. 如果max-age=0,就會向源服務器發送請求進行緩存資源新鮮度的驗證.瀏覽器普通刷新F5cache-directive 作爲請求首部時,
cache-directive
的可選值有:字段名稱 說明 no-cache 告知(代理)服務器不直接使用緩存,要求向原服務器發起請求. no-store 所有內容都不會保存到緩存或者Internet臨時文件中. max-age=delta-seconds 告知 (代理)服務器,客戶端希望接收一個存在時間不大於detal-seconds秒的資源. max-stale[=delta-seconds 告知 (代理)服務器,客戶端願意接收一個超過緩存時間的資源,若有定義delta-seconds則爲delta-seconds,若沒有則爲任意超出的時間. min-fresh=delta-seconds 告知 (代理)服務器,客戶端希望接收一個在小於delta-seconds秒內被更新過的資源. no-transform 告知 (代理)服務器,客戶端希望獲取實體數據沒有被轉換(比如壓縮)過的資源. only-if-cached 告知 (代理)服務器,客戶端希望獲取換成的內容(若有),而不用向原來服務器請求. cache-extension 自定義擴展值,若服務器不識別改值則會被忽略. cache-directive 作爲響應首部時,
cache-directive
的可選值有:字段名稱 說明 public 表明任何情況下都得緩存該資源(即使是需要HTTP認證的資源). Private[="field-name"] 表明返回報文中全部或者部分(若指定field-name,則爲field-name的字段數據)僅開放給某些用戶(服務器指定的share-user,如代理服務器)做緩存使用,其他用戶則不能緩存這些數據. no-cache 不直接使用緩存,要向服務器發起(新鮮度校驗)請求. no-store 所有內容都不會保存到緩存或者Internet臨時文件中. no-transform 告知客戶端緩存文件時不得對實體數據做任何改變. only-if-cached 告知(代理)服務器,客戶端希望獲取緩存的內容(如果有),而不向原來服務器發起請求. must-revalidate 當前資源一定是向原服務器發起驗證請求的,若請求失敗會返回504(而非代理服務器上的緩存). proxy-revalidate 與must-revalidate類似,但僅能應用於共享緩存(如代理). max-age=delta-seconds 告知客戶端,該資源在delta-seconds秒內是新鮮的,無需向 服務器發起請求. s-max-age=delta-seconds 同max-age,但僅用於共享緩存(如代理). cache-extension 自定義擴展值,若服務器不識別改值則會被忽略. 在請求頭中max-age=0與no-cache的區別?
返回的狀態來看:no-cache都是200,而max-age可能是304(如果瀏覽器有緩存). 請求參數:max-age請求頭一般會攜帶If-Modified-Since或If-None-Match字段進行新鮮度驗證,而no-cache不會攜帶. F5刷新是max-age=0來實現,而強制刷新(Ctrl+F5)是通過no-cache實現.
-
Expires:
異同:Expires
是HTTP 1.0+的首部,用來指定一個絕對的過期日期,依賴客戶端時間設置的準確性,緩存時間是相對服務器上的時間而言的.
而max-age
是HTTP/1.1的Cache-Control的一個字段,用來指定文檔的最大使用時間.
-
協商緩存
釋義: 客戶端第一次問服務器要某個資源時,服務器丟還給客戶端所請求的這個資源同時,將該資源的一些信息(文件摘要、或者最後修改時間)也返回給客戶端,告訴客戶端將這個資源緩存在本地.當客戶端下一次需要這個資源時,將請求以及相關信息(文件摘要、或者最後修改時間)一併發送給服務器,由服務器來判斷客戶端緩存的資源是否需要更新:如不需要更新,就直接告訴客戶端獲取本地緩存資源;如需要更新,則將最新的資源連同相應的信息一併返回給客戶端.Last-Modified & If-Modified-Since
&Etag & If-None-Match
-
Last-Modidied & If-Modified-Since:
-
Last-Modified
: 爲實體首部字段,值爲資源最後更新時間,隨服務器response返回. -
If-Modified-Since
: 爲請求首部字段,通過比較兩個時間來判斷資源在兩次請求期間是否有過修改,如果沒有修改,則命中協商緩存,瀏覽器從緩存中獲取資源;如果有過修改,則服務器返回資源,同時返回新的Last-Modified時間.
-
-
Etag & If-None-Match:
-
Etag
: 爲相應頭部字段,表示資源內容的唯一標識,隨服務器response返回. -
If-None-Match
: 爲請求頭部字段,服務器通過比較請求頭部的If-None-Match與當前資源的ETag是否一致來判斷資源是否在兩次請求之間有過修改,如果沒有修改,則命中協商緩存,瀏覽器從緩存中獲取資源;如果有過修改,則服務器返回資源,同時返回新的ETag.
-
-
-
不能緩存的請求
- HTTP信息頭中包含Cache-Control:no-cache,pragma:no-cache(HTTP1.0),或Cache-Control:max-age=0等告訴瀏覽器不用緩存的請求. Cache-Control: no-cache:這個很容易讓人產生誤解,使人誤以爲是響應不被緩存.實際上Cache-Control: no-cache是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應數據時,緩存都要向服務器評估緩存響應的有效性.
- 需要根據Cookie,認證信息等決定輸入內容的動態請求是不能被緩存的.
- 經過HTTPS安全加密的請求.
- POST請求無法被緩存.
- HTTP響應頭中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的請求無法被緩存.
- 瀏覽器緩存機制示意圖