客戶端HTTP緩存

緩存方式

強緩存和協商緩存html

強緩存

強緩存在請求一個文件前先檢查本地緩存有沒有該文件。瀏覽器

  • 若是本地文件不存在,直接發送網絡請求。
  • 若是本地文件存在,可是失效了,直接發送網絡請求。
  • 若是本地文件存在,而且未失效,直接使用本地緩存的文件,不發送網絡請求。

與強緩存有關的請求頭主要有兩個:緩存

Expires

Expires的值爲服務端返回的到期時間,這個時間是一個絕對的時間,若是下一次請求時,請求時間小於服務端返回的到期時間,直接使用緩存數據。服務器

Expires會有一個問題:即時間是由服務端生成的,可能會和客戶端的時間有偏差,進而致使緩存命中偏差。網絡

這個字段只適用於 HTTP 1.0,如今主流瀏覽器默認使用HTTP 1.1,故該字段不是很重要。併發

Cache-Control

Cache-Control的值爲服務端返回的到期時間,這個時間是一個相對的時間,若是下一次請求時,請求時間小於服務端返回的到期時間,直接使用緩存數據。代理

canche-control (http1.1)的常見取值 :htm

  • private 客戶端能夠緩存
  • public 客戶端和代理服務器均可緩存
  • max-age=xxx 緩存的內容將在 xxx 秒後失效
  • no-cache 使用協商緩存來驗證緩存是否失效
  • no-store 不使用任何緩存(包括強緩存和協商緩存)

協商緩存

若是本地緩存的文件存在,發送一個http協議,詢問服務器文件是否失效。blog

  • 若是未失效,服務器返回304狀態碼,此時返回的響應體中不包含內容。
  • 若是失效,服務器返回200狀態碼,此時返回的響應體中包含新的內容。

與協商緩存有關的請求頭主要有兩對:資源

Last-Modified / If-Modified-Since

第一次請求資源時,服務器下發Last-Modified,這個時間是一個絕對時間,表示資源最後修改的時間。

再次請求服務器時,客戶端會把Last-Modified的值賦給If-Modified-Since,併發給服務器。

服務器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。

若資源的最後修改時間大於If-Modified-Since,說明資源有被改動過,則響應整片資源內容,返回狀態碼200和新的last-modified,客戶端收到響應後更新資源和資源的last-modified並使用最新的資源;

若資源的最後修改時間小於或等於If-Modified-Since,說明資源無最新修改,則響應HTTP 304,瀏覽器繼續使用所保存的cache。

Etag / If-None-Match

第一次請求資源時,服務器下發Etag,這個標識表示當前資源在服務器的惟一標識(生成規則由服務器決定)。

再次請求服務器時,客戶端會把Etag的值賦If-None-Match,併發給服務器。

服務器收到請求後發現有頭If-None-Match,則與被請求資源的惟一標識進行比對進行比對。

若兩者不一樣,說明資源有被改動過,則響應整片資源內容,返回狀態碼200和新的Etag,客戶端收到響應後更新資源和資源的Etag並使用最新的資源;

若兩者相同,說明資源無最新修改,則響應HTTP 304,瀏覽器繼續使用所保存的cache。

推薦閱讀:

完全弄懂HTTP緩存機制及原理

相關文章
相關標籤/搜索