http快取知識

24號發表於2018-09-07

http快取

根據是否需要向伺服器發起請求,http快取可以分為強制快取協商快取
強制快取是指如果快取沒有過期,客戶端不會向伺服器發起請求詢問快取的有效性,直接讀取快取資料。與強制快取相關的兩個http響應頭分別是ExpiresCache-Control
協商快取需要客戶端與服務端發生互動,客戶端傳送本地快取的標識,由服務端根據標識決定快取是否有效。 兩類快取同時存在時,強制快取優先順序較高。

強制快取

Expires

Expires頭部對應的值是伺服器設定的資源過期時間,瀏覽器根據這個時間來判斷快取是否失效,但是伺服器的時間常常與客戶端的時間有誤差,這種判斷並不可靠,所以Expires現在很少使用(Expires屬於HTTP 1.0)。

Expires:Sat, 20 Aug 2016 01:40:57 GMT
複製程式碼

Cache-Control

響應頭與請求頭都支援這個屬性。通過設定不同的值定義快取策略。

  1. 禁止進行快取

快取中不會儲存響應內容

Cache-Control:no-store
複製程式碼
  1. 公共快取

'public'表示該響應可以被中間人快取(中間代理、CDN等),預設是私有快取'private'

Cache-Control:public
複製程式碼
  1. 私有快取

'private'表示該響應是專用於某使用者的,中間人不能快取此響應

Cache-Control:private
複製程式碼
  1. 快取時間

'max-age={seconds}'表示快取將在seconds秒後失效

Cache-Control:max-age=1000000
複製程式碼
  1. 協商快取

'no-cache'表示客戶端必須每次詢問服務端快取是否失效,從而決定是否使用快取內容

Cache-Control:no-cache
複製程式碼

協商快取

協商快取策略下,即使本地有快取資料,客戶端任然會向服務端傳送一個請求,並且攜帶本地快取的標識,服務端通過這個標識來判斷快取是否過期,如果快取過期,返回新的資料;如果沒有過期,返回304狀態碼告知客戶端可以繼續使用快取。快取的標識可以通過兩種方式來傳遞。

  1. 方式一:Last-Modified響應頭和If-Modified-Since請求頭

響應頭Last-Modified的值是服務端返回的資源最後修改時間,這個值將在下一次客戶端請求時作為請求頭If-Modified-Since的值傳送給服務端,服務端對比這個值與資源的最近一次修改時間,從而決定快取是否過期。

# request
If-Modified-Since: Thu, 28 Jun 2018 12:12:38 GMT
# response
Last-Modified: Thu, 28 Jun 2018 12:12:38 GMT
複製程式碼
  1. 方式二:ETag響應頭與If-None-Match請求頭

響應頭ETag的值是服務端返回的資源的唯一標識(資源一旦修改,該標識就會變化),這個值將在下一次客戶端請求時作為請求頭If-None-Match的值傳送給服務端,服務端進行對比後決定快取是否過期。

# request
If-None-Match: W/"2a9-164464f492d"
# response
ETag: W/"2a9-164464f492d"
複製程式碼

一般來講ETagLast-Modified可能同時存在,但是ETag的優先順序會更高。

相關文章