HTTP緩存相關頭字段

文章首發於個人我的博客:blog.fstars.wang/2019/12/04/…web

簡單說說 HTTP 協議中緩存相關的頭字段,本文的形式更接近於讀書筆記,進行了內容的濃縮。算法

If-Modified-Since

對應 Last-modified。服務器返回資源時,會攜帶 Last-modified,表示該資源最後修改的時間。客戶端若是緩存數據,就須要把這個時間保存起來,在下一次請求的時候用 If-Modified-Since 帶上,讓服務器判斷資源的最後修改時間是否一致。若是一致,就返回304,讓客戶端直接使用本地緩存。不然說明資源被修改,返回新資源和新的 Last-modified。瀏覽器

Last-modified

資源最後修改時間,配合 If-Modified-Since 使用。屬於響應頭字段。緩存

ETag

資源的特定版本標識符,能夠類比軟件的版本號,須要配合 If-None-Match 使用。另外,這個 E 是 Entity(實體)的意思。服務器

If-None-Match

效果相似 If-Modified-Since,客戶端第一次請求資源時會拿到響應頭裏的 ETag 字段,將其保存起來。下次請求時,就做爲 If-None-Match 頭字段的值進行請求。ETag 一般使用的是弱比較算法,即若是兩個資源語義一致,可看做爲匹配成功。若是匹配成功,返回 304,不然返回新資源和新的 ETag。另外,ETag 一般會用 W/ 開頭,表示使用了弱匹配算法。ETag 能夠用於跟蹤用戶,某種程度上,能夠做爲 cookie 的替代品。該頭字段的優先度比 If-Modified-Since 高。cookie

Cache-Control

通用消息頭字段,在請求頭和響應頭中有不一樣的語義,用於實現緩存控制。 在響應頭中,有不少值能夠選擇:優化

  1. max-age=<seconds> 表示服務器提供的資源的有效期,單位爲秒。須要注意的是,這個有效期是從響應報文生成的時刻開始計算的。這點和 cookie 是從客戶端拿到響應報文的時刻開始計算不一樣
  2. no-store 表示不容許客戶端進行緩存。這個一般用於動態頁面,好比微博首頁。
  3. no-cache 表示客戶端每次使用本地緩存前,要要先去服務器驗證。
  4. must-revalidate 表示可使用緩存,但過時後若是還想繼續用,要先去服務器端進行驗證。
  5. private 表示客戶端能夠緩存,但代理服務器不能夠緩存。好比我的主頁,登陸時接口返回有 Set-Cookie 字段
  6. public 表示客戶端和代理服務器均可以緩存。用於代理服務器能夠發揮內容緩存的做用。
  7. proxy-revalidate做用相似 must-revalidate,但做用在代理服務器上。表示代理服務器的緩存過時後,須要請求源服務器進行驗證,不涉及到客戶端。
  8. s-maxage=<seconds> 代理上緩存的有效期時長。這裏的 s 指的是 share。
  9. no-transform 表示不容許代理對資源進行修改。由於代理有時候會對資源進行一些優化,好比將常見格式的圖片轉換爲存儲空間更小的 webp 格式,返回給支持該格式的瀏覽器,以減小帶寬。設置該值表示禁止這些操做。

而在客戶端中,值有代理

  1. max-age=0 表示客戶端再也不繼續使用舊的本地緩存(有效期已經被我設爲0了),但願服務器返回一個最新的資源。
  2. no-cache 效果同 max-age=0
  3. max-stale=<seconds> 僅適用於代理,表示資源過時後在指定時間內依舊視爲有效。
  4. min-fresh=<seconds> 表示客戶端但願得到的資源能夠在必定時間內保持最新狀態
  5. only-if-cached 表示客戶端只接受代理緩存的數據,若是代理沒有緩存數據,不容許回源獲取新資源返回給客戶端。

Expire

資源無效的時間節點。優先級比 Cache-Control 低。格式例子: Expires: Thu, 05 Dec 2019 16:27:43 GMTcode

Vary

主要用於 代理服務器實現緩存服務,屬於響應頭字段。不一樣客戶端對內容格式的支持程度不一樣(好比有些支持數據壓縮,有些不支持),因此即使請求URL 和請求方法都相同,服務器返回的數據也會不一樣(稱爲內容協商)。Vary 字段記錄了代理服務器返回特定數據參考了哪些請求字段。更具體的介紹能夠看個人另外一篇文章:響應報文中的 Vary 頭字段的做用orm

Via

通用字段,記錄通過的代理節點的信息。經常使用於代理服務器和源服務器上,假設客戶端發送的請求依次通過了代理服務器A和代理服務器B,最終達到源服務器,則源服務器收到的字段爲 Via: A, B。該頭字段的做用是追蹤消息的轉發狀況,防止代理服務器之間造成環致使消息死循環。

X-Forwarded-For

Via 沒有記錄真正的發送者客戶端的 IP,因此出現了這個沒有歸入 HTTP 標準但已是事實上的標準。該字段記錄的是當前節點的請求方的 IP 地址,即記錄的內容最終爲 X-Forwarded-For: client, A, B。另外,爲了解決代理轉發時,爲了添加信息必須解析 HTTP 報文修改數據形成的成本,出現了 代理協議(The PROXY protocol),原理是將一些信息放到了HTTP報文的前面。具體原理本文不作詳細介紹。

X-Real-IP

只記錄客戶端的 IP 地址。

相關文章
相關標籤/搜索