我們應該從兩個角度來看http的快取:快取控制 和 快取校驗。
快取控制:控制快取的開關,用於標識請求或訪問中是否開啟了快取,使用了什麼樣的存方式。
快取校驗:如何校驗快取,快取的有效期,如何確定快取是最新的。
http中控制快取開關的字段有兩個:pragma 和 cache-control。
pragma已經基本淘汰,下文我們重點關注 cache-control 。
在介紹之前,我們先說明一下比較容易忽略的倆個點:
1、符合快取策略時,伺服器不會傳送新的資源,但不是說客戶端和伺服器就沒有會話了,客戶端還是會發請求到伺服器的。
2、cache-control除了在響應中使用,在請求中也可以使用。如下圖:(在開發者工具中,禁用快取)
同時在response headers中也能到cache-control欄位,這是服務端設定的,如下圖:
cache-control欄位:
在請求中使用cache-control 時,它可選的值有:
在響應中使用cache-control 時,它可選的值有:
在cache-control 中,這些值可以自由組合,多個值如果衝突時,也是有優先順序的,而no-store優先順序最高。
public和private的選擇
如果你用了cdn,你需要關注下這個值。cdn廠商一般會要求cache-control的值為public,提公升快取命中率。如果你的快取命中率很低,而訪問量很大的話,可以看下是不是設定了private,no-cache這類的值。如果定義了max-age,可以不用再定義public,它們的意義是一樣的。
**設定cache-control
以lnmp的環境為例,一次響應經歷的過程是:php-cgi解析**並執行,將結果返回給nginx,如果nginx前面有反向**,則會經過一次反向**伺服器,所以cache-control可能會在nginx,php-cgi,php**,反向**伺服器這些地方地方設定。在php.ini中,有個引數是session.cache_limiter,需要注意下。
在nginx中有個很常見的配置:
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$這個指令等同於cache-control: max-age=2592000,同時你會在響應頭部看到乙個etag欄位,這是由於nginx預設開啟,如果要關閉可以增加個配置etag off。etag就是我們接下要看的快取校驗字段。
在快取中,我們需要乙個機制來驗證快取是否有效。比如伺服器的資源更新了,客戶端需要及時重新整理快取;又或者客戶端的資源過了有效期,但伺服器上的資源還是舊的,此時並不需要重新傳送。快取校驗就是用來解決這些問題的,在http 1.1 中,我們主要關注下last-modified 和 etag 這兩個字段。
last-modified
服務端在返回資源時,會將該資源的最後更改時間通過last-modified欄位返回給客戶端。客戶端下次請求時通過if-modified-since或者if-unmodified-since帶上last-modified,服務端檢查該時間是否與伺服器的最後修改時間一致:如果一致,則返回304狀態碼,不返回資源;如果不一致則返回200和修改後的資源,並帶上新的時間。
if-modified-since和if-unmodified-since的區別是:
if-modified-since:告訴伺服器如果時間一致,返回狀態碼304
if-unmodified-since:告訴伺服器如果時間不一致,返回狀態碼412
etag
單純的以修改時間來判斷還是有缺陷,比如檔案的最後修改時間變了,但內容沒變。對於這樣的情況,我們可以使用etag來處理。
etag的方式是這樣:伺服器通過某個演算法對資源進行計算,取得一串值(類似於檔案的md5值),之後將該值通過etag返回給客戶端,客戶端下次請求時通過if-none-match或if-match帶上該值,伺服器對該值進行對比校驗:如果一致則不要返回資源。
if-none-match和if-match的區別是:
if-none-match:告訴伺服器如果一致,返回狀態碼304,不一致則返回資源
if-match:告訴伺服器如果不一致,返回狀態碼412
總結
快取開關是:pragma, cache-control。
快取校驗有:expires,last-modified,etag。
從狀態碼的角度來看,它們的關係如下圖:
cache-control的各個值關係如下圖:
Http快取機制
快取快取,就是把需要的東西存起來,不需要每次都去請求。主要目的減小伺服器壓力,放到客戶端上來講,還利於節省流量,還能流暢的把ui顯示出來,提高了使用者體驗。對於http快取來講,主要的就是校驗快取的有效性,也就是新鮮度。如果客戶端不能及時響應服務端的資料變化,快取一直不能被更新,那不就是得不償失了?...
HTTP 快取機制
基於 header的示例 content length 3534http快取策略分為 1 快取策略 cache control 頭里的 public private no cache max age no store 其中no store為不儲存,no cache 0秒的max age 2 快取過期...
http快取機制
首先需要了解http協議的響應頭中的幾個欄位的含義 cache control expires 該欄位表示資源的過期時間。etag 該欄位表示資源的唯一標識。last modified 該欄位表示資源的最後修改時間。有以下2個問題需要注意 為什麼優先校驗etag,後校驗last modified?因...