每個瀏覽器都自帶了HTTP緩存實現功能。只需要確保每個服務器響應都提供正確的HTTP響應頭標誌,以指示瀏覽器何時可以緩存響應以及可以緩存多久。
Cache-Control
每個服務端資源可以通過Cache-Control標誌定義其緩存策略。
Cache-Control控制誰在什麼條件下可以緩存響應 以及 可以緩存多久。
max-age
指定從請求的時間開始,允許獲取的響應被重用的最長時間(單位:秒)。
例如,max-age=60表示可在接下來的60秒緩存和重用響應。
no-cache
和no-store
no-cache 表示必須先與服務器確認返回的響應是否發生了變化,然後才能使用該響應來滿足後續對同一網址的請求。因此,如果存在合適的驗證令牌(ETag),no-cache會發起往返通信來驗證緩存的響應。如果資源未發生變化,則不下載資源。
no-store 相對簡單,直接禁止 瀏覽器以及所有中間緩存 存儲任何版本的返回響應。例如,包含個人隱私數據或銀行業務數據的響應。每次用戶請求該資源時,都會向服務器發送請求,並下載完整的響應。
public
和private
public 表示無論什麼情況(比如,有與它相關聯的驗證ETag,響應狀態碼無法正常緩存),響應都可以被緩存。大多數情況下,public不是必須的,因爲明確的緩存信息(如 max-age)已表示響應是可以緩存的。
private 表示瀏覽器可以緩存這個響應,這個響應通常只爲單個用戶緩存,不允許任何中間緩存對其進行緩存。例如,用戶的瀏覽器可以緩存包含用戶信息的HTML網頁,但CDN不可以。
例子說明
Cache-Control: max-age=86400
瀏覽器以及任何中間緩存均可以將響應(public響應)緩存長達1天(60秒 * 60分鐘 * 24小時)
Cache-Control: private,max-age=600
客戶端的瀏覽器只能將響應緩存最長10分鐘(60秒 * 10分鐘)。
Cache-Control: no-store
不允許緩存響應,每次請求都必須完整獲取。
ETag
服務器使用ETag標誌代表驗證令牌,它可以實現高效的資源更新檢查,資源未發生變化時不會傳送任何數據。
ETag 可以解決max-age過期重新請求,但服務端資源未發生變化,重新下載效率太低的問題。
比如這樣一個場景:假如在首次獲取資源120秒後(max-age=120),瀏覽器又對該資源發起了新的請求。首先,瀏覽器會檢查本地緩存並找到之前的響應。可惜該響應現在已過期,瀏覽器無法使用。此時,瀏覽器可以直接發出新的請求,並獲取新的完整響應。但是這樣做效率太低,因爲如果資源未發生變化,那麼下載 與緩存中相同 的資源,則太浪費網絡流量。
有了ETag就可以解決這樣的問題場景。服務器生成並返回的隨機令牌ETag通常是文件內容的哈希值 或 某個其他指紋。客戶端只需在下一次請求時,將其(ETag)發送至服務器。如果ETag仍然相同,則表示資源未發生變化,可以跳過下載。
例如上面圖片,客戶端自動在If-None-Match的HTTP請求頭中請求ETag令牌。服務器根據當前資源覈對令牌。如果它未發生變化,服務器將返回304 Not Modified響應,告知瀏覽器緩存中的響應未發生變化,可以再延用120秒。這樣瀏覽器就不用再次下載響應,節約時間和帶寬。
range & Content-Range
HTTP1.1 協議(RFC2616)開始支持獲取文件的部分內容,從而支持HTTP斷點續傳。客戶端的請求頭對應的參數是range
,服務端的響應頭對應的參數是Content-Range
range
請求頭的參數,一般格式如下:
range: (unit=first byte pos)-[last byte pos]
指定第一個字節的位置和最後一個字節的位置。
例子說明
range: bytes=0-7569
表示第 0-7569 字節範圍的內容
range: bytes=-7569
表示最後7569字節的內容
range: bytes=0-
表示從第0字節開始到文件結束部分的內容
range: bytes=0-0,-1
表示第一個和最後一個字節
range: bytes=100-200,400-500,600-700
同時指定幾個範圍
Content-Range
響應頭的參數,服務器返回當前接受的範圍和文件總大小。一般格式如下:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
例子說明
Content-Range: bytes 0-7569/50000
0-7569指當期發送的數據範圍,50000指文件的總大小
在響應完成後,返回的響應頭內容表示不同的意思
HTTP/1.1 200 Ok(不使用斷點續傳方式)
HTTP/1.1 206 Partial Content(使用斷點續傳方式)
參考