HTTP緩存學習

1. 緩存控制Catch-Control


  • max-age:緩存有效期
  • public:允許其他用戶讀取緩存(公共緩衝服務器)
  • private:只允許特定用戶讀取緩存(公共緩衝服務器)
  • no-catch:不走強緩存,每次都請求服務器驗證緩存是否可用(協商)
  • no-store:不走緩存,每次直接請求數據

2. 緩存過期判斷機制


  • 根據Catch-Controls-maxagemax-age判斷,以s-maxage爲例,若當前時間>緩存生成時間+s-maxage則表示已經過期(s-maxagemax-age作用都是設置緩存儲存最大週期,s-maxage適用於多用戶的公共緩存服務器)
  • 根據Expire比較,Expire代表一個絕對過期時間,若當前時間>Expire,代表緩存已經過期
注: HTTP/1.1之前Expire優先級高於s-maxagemax-age,之後則相反

3. 協商緩存


根據判斷機制判斷出緩存過期後,進行協商緩存

  • Etag:實體標記,服務器資源每次更改都會引起資源Etag值的變化
  • Last-Modified:最後更新時間,服務器資源最後更新的時間
  • if-None-Match:放在請求頭用於判斷服務器對應值是否與傳入值相同
  • if-Modified-Since:用於告訴服務器字段值早期更新時間,若與服務端不一致,則會處理請求
    當客戶端第一次請求資源時,服務器會將所請求資源的EtagLast-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

EtagLast-Modified比較

  • Etag比對的是資源內容,可以檢測到細微改變
  • Last-Modified比對的是資源文件修改時間,在內容未更改僅僅是修改時間更改的情況下也會引起重新發送數據,檢查粒度是秒級,秒級以下的更改無法判斷

由此可以看出,Etag能夠更加精準控制緩存,兩者可以同時存在,服務器優先驗證Etag

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章