http快取
根據是否需要向伺服器發起請求,http快取可以分為強制快取
與協商快取
。
強制快取
是指如果快取沒有過期,客戶端不會向伺服器發起請求詢問快取的有效性,直接讀取快取資料。與強制快取
相關的兩個http響應頭分別是Expires
和Cache-Control
。
協商快取
需要客戶端與服務端發生互動,客戶端傳送本地快取的標識,由服務端根據標識決定快取是否有效。
兩類快取同時存在時,強制快取優先順序較高。
強制快取
Expires
頭
Expires
頭部對應的值是伺服器設定的資源過期時間,瀏覽器根據這個時間來判斷快取是否失效,但是伺服器的時間常常與客戶端的時間有誤差,這種判斷並不可靠,所以Expires
現在很少使用(Expires
屬於HTTP 1.0)。
Expires:Sat, 20 Aug 2016 01:40:57 GMT
複製程式碼
Cache-Control
頭
響應頭與請求頭都支援這個屬性。通過設定不同的值定義快取策略。
- 禁止進行快取
快取中不會儲存響應內容
Cache-Control:no-store
複製程式碼
- 公共快取
'public'表示該響應可以被中間人快取(中間代理、CDN等),預設是私有快取'private'
Cache-Control:public
複製程式碼
- 私有快取
'private'表示該響應是專用於某使用者的,中間人不能快取此響應
Cache-Control:private
複製程式碼
- 快取時間
'max-age={seconds}'表示快取將在seconds秒後失效
Cache-Control:max-age=1000000
複製程式碼
- 協商快取
'no-cache'表示客戶端必須每次詢問服務端快取是否失效,從而決定是否使用快取內容
Cache-Control:no-cache
複製程式碼
協商快取
協商快取
策略下,即使本地有快取資料,客戶端任然會向服務端傳送一個請求,並且攜帶本地快取的標識,服務端通過這個標識來判斷快取是否過期,如果快取過期,返回新的資料;如果沒有過期,返回304狀態碼告知客戶端可以繼續使用快取。快取的標識可以通過兩種方式來傳遞。
- 方式一:
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
複製程式碼
- 方式二:
ETag
響應頭與If-None-Match
請求頭
響應頭
ETag
的值是服務端返回的資源的唯一標識(資源一旦修改,該標識就會變化),這個值將在下一次客戶端請求時作為請求頭If-None-Match
的值傳送給服務端,服務端進行對比後決定快取是否過期。
# request
If-None-Match: W/"2a9-164464f492d"
# response
ETag: W/"2a9-164464f492d"
複製程式碼
一般來講ETag
與Last-Modified
可能同時存在,但是ETag
的優先順序會更高。