1. 緩存控制Catch-Control
max-age
:緩存有效期public
:允許其他用戶讀取緩存(公共緩衝服務器)private
:只允許特定用戶讀取緩存(公共緩衝服務器)no-catch
:不走強緩存,每次都請求服務器驗證緩存是否可用(協商)no-store
:不走緩存,每次直接請求數據
2. 緩存過期判斷機制
- 根據
Catch-Control
的s-maxage
或max-age
判斷,以s-maxage
爲例,若當前時間
>緩存生成時間+s-maxage
則表示已經過期(s-maxage
與max-age
作用都是設置緩存儲存最大週期,s-maxage
適用於多用戶的公共緩存服務器) - 根據
Expire
比較,Expire
代表一個絕對過期時間,若當前時間
>Expire
,代表緩存已經過期
注: HTTP/1.1
之前Expire
優先級高於s-maxage
或max-age
,之後則相反
3. 協商緩存
根據判斷機制判斷出緩存過期後,進行協商緩存
Etag
:實體標記,服務器資源每次更改都會引起資源Etag值的變化Last-Modified
:最後更新時間,服務器資源最後更新的時間if-None-Match
:放在請求頭用於判斷服務器對應值是否與傳入值相同if-Modified-Since
:用於告訴服務器字段值早期更新時間,若與服務端不一致,則會處理請求
當客戶端第一次請求資源時,服務器會將所請求資源的Etag
和Last-Modified
放在響應頭交給客戶端
Etag
驗證
當客戶端第二次請求資源時,會將Etag
作爲if-None-Match
的字段值,用於驗證資源是否改變,若if-None-Match
與服務端Etag
不一致,說明服務端資源已經更改,服務器接受請求,返回新資源,否則返回304(此時響應頭還會有Etag
,即使沒有變化)
Last-Modified
驗證
當客戶端第二次請求資源時,將Last-Modified
作爲if-Modified-Since
的字段值,提交給服務端,服務器會對比服務器資源的Last-Modified
與客戶端傳入的if-Modified-Since
,如果不一致說明資源更改時間不一致,有更新,返回新資源,否則返回304(響應頭不會添加Last-Modified
)
Etag
和Last-Modified
比較
Etag
比對的是資源內容,可以檢測到細微改變Last-Modified
比對的是資源文件修改時間,在內容未更改僅僅是修改時間更改的情況下也會引起重新發送數據,檢查粒度是秒級,秒級以下的更改無法判斷
由此可以看出,Etag
能夠更加精準控制緩存,兩者可以同時存在,服務器優先驗證Etag