文章首發於個人我的博客:blog.fstars.wang/2019/12/04/…web
簡單說說 HTTP 協議中緩存相關的頭字段,本文的形式更接近於讀書筆記,進行了內容的濃縮。算法
對應 Last-modified。服務器返回資源時,會攜帶 Last-modified,表示該資源最後修改的時間。客戶端若是緩存數據,就須要把這個時間保存起來,在下一次請求的時候用 If-Modified-Since 帶上,讓服務器判斷資源的最後修改時間是否一致。若是一致,就返回304,讓客戶端直接使用本地緩存。不然說明資源被修改,返回新資源和新的 Last-modified。瀏覽器
資源最後修改時間,配合 If-Modified-Since 使用。屬於響應頭字段。緩存
資源的特定版本標識符,能夠類比軟件的版本號,須要配合 If-None-Match 使用。另外,這個 E 是 Entity(實體)的意思。服務器
效果相似 If-Modified-Since,客戶端第一次請求資源時會拿到響應頭裏的 ETag 字段,將其保存起來。下次請求時,就做爲 If-None-Match 頭字段的值進行請求。ETag 一般使用的是弱比較算法,即若是兩個資源語義一致,可看做爲匹配成功。若是匹配成功,返回 304,不然返回新資源和新的 ETag。另外,ETag 一般會用 W/
開頭,表示使用了弱匹配算法。ETag 能夠用於跟蹤用戶,某種程度上,能夠做爲 cookie 的替代品。該頭字段的優先度比 If-Modified-Since 高。cookie
通用消息頭字段,在請求頭和響應頭中有不一樣的語義,用於實現緩存控制。 在響應頭中,有不少值能夠選擇:優化
max-age=<seconds>
表示服務器提供的資源的有效期,單位爲秒。須要注意的是,這個有效期是從響應報文生成的時刻開始計算的。這點和 cookie 是從客戶端拿到響應報文的時刻開始計算不一樣no-store
表示不容許客戶端進行緩存。這個一般用於動態頁面,好比微博首頁。no-cache
表示客戶端每次使用本地緩存前,要要先去服務器驗證。must-revalidate
表示可使用緩存,但過時後若是還想繼續用,要先去服務器端進行驗證。private
表示客戶端能夠緩存,但代理服務器不能夠緩存。好比我的主頁,登陸時接口返回有 Set-Cookie 字段public
表示客戶端和代理服務器均可以緩存。用於代理服務器能夠發揮內容緩存的做用。proxy-revalidate
做用相似 must-revalidate
,但做用在代理服務器上。表示代理服務器的緩存過時後,須要請求源服務器進行驗證,不涉及到客戶端。s-maxage=<seconds>
代理上緩存的有效期時長。這裏的 s 指的是 share。no-transform
表示不容許代理對資源進行修改。由於代理有時候會對資源進行一些優化,好比將常見格式的圖片轉換爲存儲空間更小的 webp 格式,返回給支持該格式的瀏覽器,以減小帶寬。設置該值表示禁止這些操做。而在客戶端中,值有代理
max-age=0
表示客戶端再也不繼續使用舊的本地緩存(有效期已經被我設爲0了),但願服務器返回一個最新的資源。no-cache
效果同 max-age=0
。max-stale=<seconds>
僅適用於代理,表示資源過時後在指定時間內依舊視爲有效。min-fresh=<seconds>
表示客戶端但願得到的資源能夠在必定時間內保持最新狀態only-if-cached
表示客戶端只接受代理緩存的數據,若是代理沒有緩存數據,不容許回源獲取新資源返回給客戶端。資源無效的時間節點。優先級比 Cache-Control
低。格式例子: Expires: Thu, 05 Dec 2019 16:27:43 GMT
code
主要用於 代理服務器實現緩存服務,屬於響應頭字段。不一樣客戶端對內容格式的支持程度不一樣(好比有些支持數據壓縮,有些不支持),因此即使請求URL 和請求方法都相同,服務器返回的數據也會不一樣(稱爲內容協商)。Vary 字段記錄了代理服務器返回特定數據參考了哪些請求字段。更具體的介紹能夠看個人另外一篇文章:響應報文中的 Vary 頭字段的做用orm
通用字段,記錄通過的代理節點的信息。經常使用於代理服務器和源服務器上,假設客戶端發送的請求依次通過了代理服務器A和代理服務器B,最終達到源服務器,則源服務器收到的字段爲 Via: A, B
。該頭字段的做用是追蹤消息的轉發狀況,防止代理服務器之間造成環致使消息死循環。
Via 沒有記錄真正的發送者客戶端的 IP,因此出現了這個沒有歸入 HTTP 標準但已是事實上的標準。該字段記錄的是當前節點的請求方的 IP 地址,即記錄的內容最終爲 X-Forwarded-For: client, A, B
。另外,爲了解決代理轉發時,爲了添加信息必須解析 HTTP 報文修改數據形成的成本,出現了 代理協議(The PROXY protocol),原理是將一些信息放到了HTTP報文的前面。具體原理本文不作詳細介紹。
只記錄客戶端的 IP 地址。