HTTP的快取控制

2022-06-11 15:36:15 字數 2863 閱讀 9199

1.快取的分類:

(1)快取分為服務端側(server side,比如 nginx、apache)和客戶端側(client side,比如 web browser)。

(2)服務端快取又分為 **伺服器快取 和 反向**伺服器快取(也叫閘道器快取,比如 nginx反向**、squid等),其實廣泛使用的 cdn 也是一種服務端快取,目的都是讓使用者的請求走」捷徑「,並且都是快取、檔案等靜態資源。

客戶端側快取一般指的是瀏覽器快取,目的就是加速各種靜態資源的訪問,想想現在的大型**,隨便乙個頁面都是一兩百個請求,每天 pv 都是億級別,如果沒有快取,使用者體驗會急劇下降、同時伺服器壓力和網路頻寬都面臨嚴重的考驗。

2.瀏覽器快取控制機制

有兩種:html meta標籤和 http頭資訊

(1)http meta標籤控制快取

瀏覽器快取機制,其實主要就是http協議定義的快取機制(如: expires; cache-control等)。但是也有非http協議定義的快取機制,如使用html meta 標籤,web開發者可以在html頁面的節點中加入標籤,**如下:

"

pragma

" content="

no-cache

">

上述**的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需要去伺服器拉取。使用上很簡單,但只有部分瀏覽器可以支援,而且所有快取**伺服器都不支援,因為**不解析html內容本身。

(2)http頭資訊控制快取(廣泛應用)

瀏覽器第一次請求流程

瀏覽器再次請求流程

expires策略:expires是web伺服器響應訊息頭欄位,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩訪問資料,而無需再次請求。不過expires 是http 1.0的東西,現在預設瀏覽器均預設使用http 1.1,所以它的作用基本忽略。expires 的乙個缺點就是,返回的到期時間是伺服器端的時間,這樣存在乙個問題,如果客戶端的時間與伺服器的時間相差很大(比如時鐘不同步,或者跨時區),那麼誤差就很大,所以在http 1.1版開始,使用cache-control: max-age=秒替代。

cache-control:max-age策略(重點關注):cache-control與expires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩訪問資料還是重新發請求到伺服器取資料。只不過cache-control的選擇更多,設定更細緻,如果同時設定的話,其優先順序高於expires。如果時間大於max-age,就會進行檔案新鮮度檢測。

伺服器檢測檔案的新鮮度

本地快取過期,快取和伺服器檔案可能一樣,也有可能不一樣。如果一樣的話,就沒有必要返回內容。如果不一樣,就返回內容,就相當於一次新的請求。

怎麼判斷檔案是否一致呢?現在的做法通過檔案生成時間或者對檔案進行md5值計算。

狀態碼:304  not modified

客戶端發起乙個get

請求,如果最近資源未被修改的話,就可以用這個狀態碼說明資源未被修改。

last-modified,檔案生成時間或者最後修改時間。下一次請求的頭部,新增if-modified-since,值是上次respone頭部的last-modified值,和伺服器進行對比,如果一樣的話,直接返回304,資料內容為空。【這裡也會存在乙個問題,如果檔案定期更新,但是檔案內容不更新,豈不是白白耗費流量。】

etag , 伺服器端對檔案計算出來的乙個值。下一次請求的頭部,新增if-none-match,和伺服器進行對比,如果一樣的話,直接返回304,資料內容為空。

》last-modified/if-modified-since:last-modified/if-modified-since要配合cache-control使用。last-modified:標示這個響應資源的最後修改時間。web伺服器在響應請求時,告訴瀏覽器資源的最後修改時間。

if-modified-since:當資源過期時(使用cache-control標識的max-age),發現資源具有last-modified宣告,則再次向web伺服器請求時帶上頭 if-modified-since,表示請求時間。web伺服器收到請求後發現有頭if-modified-since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應訊息包體內),http 200;若最後修改時間較舊,說明資源無新修改,則響應http 304 (無需包體,節省瀏覽),告知瀏覽器繼續使用所儲存的cache。

》etag/if-none-match:etag/if-none-match也要配合cache-control使用。

etag:web伺服器響應請求時,告訴瀏覽器當前資源在伺服器的唯一標識(生成規則由伺服器決定)。apache中,etag的值,預設是對檔案的索引節(inode),大小(size)和最後修改時間(mtime)進行hash後得到的。

etag是伺服器自動生成或者由開發者生成的對應資源在伺服器端的唯一識別符號,能夠更加準確的控制快取。last-modified與etag一起使用時,伺服器會優先驗證etag。

http學習 http的快取控制

由於請求 應答模式的通訊成本比較高,所以有必要將某些資料進行快取,從而節省頻寬。快取是優化系統效能的重要手段,http 傳輸的每乙個環節中都可以有快取 2.1 快取控制的流程 瀏覽器發現快取無資料,於是傳送請求,向伺服器獲取資源 伺服器響應請求,返回資源,同時標記資源的有效期 瀏覽器快取資源,等待下...

生鮮速遞 HTTP的快取控制

快取 cache 是計算機效能的乙個重要概念。由於鏈路漫長,網路時延不可控,瀏覽器使用 http 獲取資源的成本較高。所以,非常有必要把 來之不易 的資料快取起來,下次再請求的時候盡可能地復用。一 伺服器的快取控制 伺服器負責控制,瀏覽器負責快取 我們以生鮮速遞作為例子說一下。如果我現在想要吃乙個西...

http頭部如何對快取的控制

文章自于我的個人部落格 使用快取的目的就是在於減少計算,io,網路等時間,可以快速的返回,特別是流量比較大的時候,可以節約很多伺服器頻寬和壓力。乙個請求從快取的方面來說,有三個過程。expires,http 1.0版本定義的response頭部,定義過期時間,如果本地時間發現超過過期時間,就會向伺服...