https快取
- 強制快取 當快取資料庫中已有所請求的資料時,客戶端直接從資料庫讀取資料。當快取資料庫中沒有所請求的資料時,客戶端才會從服務端獲取
-
協商快取 客戶端會先從快取資料庫中獲取到一個快取資料的標識,得到標識後請求服務端驗證標識是否失效,如果沒有失效服務端會返回304,此時客戶端再從快取中讀取資料,如果失效,服務端會返回跟新的資料。
-
強制快取伺服器響應的header中會用兩個欄位來表明-Expires和Cach-Control。
- Expires的值為伺服器資料到期時間,由於服務端的時間和客戶端的時間有誤差會導致快取命中的誤差。
- Cache-Control
- private:客戶端可以快取
- public 客戶端和代理伺服器都可以快取
- max-age=t:快取內容在t秒後失效
- no-cache:需要使用協商快取(伺服器)來驗證快取資料
- no-store:所有資料都不會快取
-
協商快取是隻需要對比是否可以進行快取,瀏覽器第一次請求資料時,伺服器會將快取標識與資料一起響應給客戶端,當瀏覽器再次請求時,客戶端先將快取標誌傳送給伺服器,伺服器根據此標識進行判斷,若未失效返回304,流浪器可以使用快取資料。接下了解下快取標識
- Last-Modified : 伺服器在響應請求時,會告訴瀏覽器資源的最後修改時間。
- if-Modified-Since: 瀏覽器再次請求資料時,會將請求頭包含次欄位,後面跟著在快取中獲得的最後修改時間。伺服器發現有此欄位時,和請求資源的最後修改時間進行比對。
- 如果真被修改了那麼開始響應一個整體,伺服器返回:200 OK
- 如果沒有被修改只響應header,伺服器返回304 NotModified
- if-Unmodified-Since:從某個時間點算起,檔案是否沒有被修改
- 如果沒有被修改:則開始繼續傳輸檔案,伺服器返回200
- 如果檔案被修改:則不傳輸,伺服器返回:412 Precondition Faild(預處理錯誤)
- Etag HTTP1.1推出的。伺服器響應時,通過次欄位告訴瀏覽器當前資源在伺服器生成的唯一標識
- If-None-Match:再次請求伺服器時,瀏覽器的請求報文頭部會包含此欄位,後面的值為在快取中獲取的標識。伺服器接收到次報文後發現If-None-Match則與被請求資源的唯一標識進行對比。
- 不同,說明資源被改動過,則響應整個資源內容,返回狀態碼200
- 相同,說明資源無心修改,則響應header,瀏覽器直接從快取中獲取資料資訊。返回狀態碼304
- If-None-Match:再次請求伺服器時,瀏覽器的請求報文頭部會包含此欄位,後面的值為在快取中獲取的標識。伺服器接收到次報文後發現If-None-Match則與被請求資源的唯一標識進行對比。