一文總結HTTP快取

2021-10-03 11:47:21 字數 2768 閱讀 7561

快取是乙個很大的話題,本文只是講述http快取。

http 頭資訊控制快取

大致分為兩種:強快取和協商快取。強快取如果命中快取不需要和伺服器端發生互動,而協商快取不管是否命中都要和伺服器端發生互動,強制快取的優先順序高於協商快取。

兩類快取規則的不同,強制快取如果生效,不需要再和伺服器發生互動,而對比快取不管是否生效,都需要與服務端發生互動。

可以理解為無須驗證的快取策略。響應頭包括兩種字段 http/1.0 expires和http/1.1 cache-control。cache-control 比 expires 優先順序更高。

expires

expires 指快取過期的時間。expires 存在於 。到期時間是由服務端生成的,客戶端時間可能跟服務端時間有誤差,會導致快取命中的誤差。

cache-control

cache-control 可以由多個字段組合而成,多個指令以逗號分隔。分客戶端和服務端。

客戶端可以在http請求中使用的標準 cache-control 指令。

cache-control: max-age=cache-control: max-stale[=]

cache-control: min-fresh=cache-control: no-cache

cache-control: no-store

cache-control: no-transform

cache-control: only-if-cached

伺服器可以在響應中使用的標準 cache-control 指令。

cache-control: must-revalidate

cache-control: no-cache

cache-control: no-store

cache-control: no-transform

cache-control: public

cache-control: private

cache-control: proxy-revalidate

cache-control: max-age=cache-control: s-maxage=

cache-control引數講解 注:

拓展快取指令不是核心http快取標準文件的一部分,使用前請注意檢查相容性!

cache-control: immutable 

cache-control: stale-while-revalidate=cache-control: stale-if-error=

怎樣決定乙個資源的cache-control策略呢?參考定義最佳 cache-control 策略

存在於http/1.0版本中,只有一種值pragema:no-cache, 防止頁面被快取,等價於http/1.1中cache-control:no-cache

對比快取,服務端下發的快取時間到期,並不意味著資源內容發生改變,如果本地資源和伺服器上的資源沒有差異,實際上沒有必要再次請求。客戶端和伺服器端通過某種驗證機制驗證當前請求資源是否可以使用快取。

瀏覽器第一次請求資料之後會將資料和響應頭部的快取標識儲存起來。再次請求時會帶上儲存的頭部字段,伺服器端驗證是否可用。返回 304 not modified,代表資源沒有發生改變可以使用快取的資料,獲取新的過期時間。返回 200 則需要重新請求一遍資源並替換舊資源。

last-modified/if-modified-since

last-modified: 伺服器端資源的最後修改時間,響應頭部會帶上這個標識。第一次請求之後,瀏覽器記錄這個時間,再次請求時,請求頭部帶上if-modified-since即為之前記錄下的時間。伺服器端收到帶 if-modified-since 的請求後會去和資源的最後修改時間對比。若修改過就返回最新資源,狀態碼 200,若沒有修改過則返回 304。

注意:如果響應頭中有 last-modified 而沒有 expire 或 cache-control 時,瀏覽器會有自己的演算法來推算出乙個時間快取該檔案多久,不同瀏覽器得出的時間不一樣,所以 last-modified 要配合 expires/cache-control 使用。

etag/if-none-match

etag,即entity tag,由伺服器端上生成的一段 hash 字串,生成規則由伺服器決定(比如根據資源的索引節(inode),大小(size)和最後修改時間(mtime)進行hash),對應著唯一資源。第一次請求時響應頭帶上 etag,隨後的請求帶上 if-none-match,伺服器檢查 etag,返回 304 或 200。優先順序高於last-modified/if-modified-since

last-modified 和 etag 區別:

某些伺服器不能精確得到資源的最後修改時間,這樣就無法通過最後修改時間判斷資源是否更新。

last-modified 只能精確到秒。

資源的最後修改時間改變,但內容不一定改變,使用 last-modified 看不出內容沒有改變。

etag 的精度比 last-modified 高,屬於強驗證,要求資源位元組級別的一致,優先順序高。如果伺服器端有提供 etag 的話,必須先對 etag 進行 conditional request。

以chrome為例,有兩類(只需要看載入頁面時的第乙個請求):

直白理解一文搞定http協議快取

由於http協議在快取機制這一塊做了很多次迭代。並且每次迭代都做了向下相容 因為如果你不向下相容,一些頑固的古董的瀏覽器廠商不願意公升級就會沒有支援http協議了。為了遷就他們所以做了向下相容 為了我們更好記住最新的,重要的,簡單的,常用的快取機制,我們先講終點。然後再掘墳,考古。這個是http1....

一文讀懂前端快取

按快取位置分類 memory cache,disk cache,service worker 等 按失效策略分類 cache control,etag 等 幫助理解原理的一些案例 快取的應用模式 service worker memory cache disk cache 網路請求 根據 servi...

一文讀懂 HTTP 2 特性

http 2 是 http 協議自 1999 年 http 1.1 發布後的首個更新,主要基於 spdy 協議。由網際網路工程任務組 ietf 的 hypertext transfer protocol bis httpbis 工作小組進行開發。該組織於2014年12月將http 2標準提議遞交至i...