6.1 HTTP首部字段之詳解___Cache-Control、Connection、Date、Pragma、Trailer、Transfer-Encoding、Upgrade、Warning

一.HTTP/1.1 通用首部字段

通用首部字段是指,請求報文和響應報文雙方都會使用的首部。

1. (1)Cache-Control

通過指定首部字段 Cache-Control 的指令,就能操作緩存的工作機 制。如圖:
在這裏插入圖片描述
指令的參數是可選的,多個指令之間通過“,”分隔。首部字段 Cache- Control 的指令可用於請求及響應時。

Cache-Control: private, max-age=0, no-cache

可用的指令按請求和響應分類如下所示:
緩存請求指令
在這裏插入圖片描述
緩存響應指令
在這裏插入圖片描述

(2)表示是否能緩存的指令

public 指令

Cache-Control: public

當指定使用 public 指令時,則明確表明其他用戶也可利用緩存。
private指令
在這裏插入圖片描述

Cache-Control: private

當指定 private 指令後,響應只以特定的用戶作爲對象,這與 public 指令的行爲相反。 緩存服務器會對該特定用戶提供資源緩存的服務,對於其他用戶發送 過來的請求,代理服務器則不會返回緩存。

no-cache指令
在這裏插入圖片描述

Cache-Control: no-cache

使用 no-cache 指令的目的是爲了防止從緩存中返回過期的資源。 客戶端發送的請求中如果包含 no-cache 指令,則表示客戶端將不會接 收緩存過的響應。於是,“中間”的緩存服務器必須把客戶端請求轉發 給源服務器。 如果服務器返回的響應中包含 no-cache 指令,那麼緩存服務器不能對 資源進行緩存。源服務器以後也將不再對緩存服務器請求中提出的資 源有效性進行確認,且禁止其對響應資源進行緩存操作。

Cache-Control: no-cache=Location

由服務器返回的響應中,若報文首部字段 Cache-Control 中對 no-cache 字段名具體指定參數值,那麼客戶端在接收到這個被指定參數值的首 部字段對應的響應報文後,就不能使用緩存。換言之,無參數值的首 部字段可以使用緩存。只能在響應指令中指定該參數

3. 控制可執行緩存的對象的指令

no-store 指令

Cache-Control: no-store

當使用 no-store 指令時,暗示請求(和對應的響應)或響應中包含 機密信息。表示不進行緩存

從字面意思上很容易把 no-cache 誤解成爲不緩存,但事實上 no-cache 代表不緩 存過期的資源,緩存會向源服務器進行有效期確認後處理資源,也許稱爲 do-not- serve-from-cache-without-revalidation 更合適。no-store 纔是真正地不進行緩存,請 讀者注意區別理解。

因此,該指令規定緩存不能在本地存儲請求或響應的任一部分

(3).指定緩存期限和認證的指令

s-maxage 指令

Cache-Control: s-maxage=604800(單位 :秒)

s-maxage 指令的功能和 max-age 指令的相同,它們的不同點是s- maxage 指令只適用於供多位用戶使用的公共緩存服務器(一般指代理服務器) 。也就是 說,對於向同一用戶重複返回響應的服務器來說,這個指令沒有任何 作用,另外,當使用 s-maxage 指令後,則直接忽略對 Expires 首部字段及 max-age 指令的處理。

max-age指令
在這裏插入圖片描述

Cache-Control: max-age=604800(單位:秒)

當客戶端發送的請求中包含 max-age 指令時,如果判定緩存資源的緩 存時間數值比指定時間的數值更小,那麼客戶端就接收緩存的資源。 另外,當指定 max-age 值爲 0,那麼緩存服務器通常需要將請求轉發 給源服務器。 當服務器返回的響應中包含 max-age 指令時,緩存服務器將不對資源 的有效性再作確認,而 max-age 數值代表資源保存爲緩存的最長時 間。應用 HTTP/1.1 版本的緩存服務器遇到同時存在 Expires 首部字段的情 況時,會優先處理 max-age 指令,而忽略掉 Expires 首部字段。而 HTTP/1.0 版本的緩存服務器的情況卻相反,max-age 指令會被忽略

min-fresh 指令
在這裏插入圖片描述

Cache-Control: min-fresh=60(單位:秒)

min-fresh 指令要求緩存服務器返回至少還未過指定時間的緩存資源。 比如,當指定 min-fresh 爲 60 秒後,過了 60 秒的資源都無法作爲響 應返回了。

max-stale 指令

Cache-Control: max-stale=3600(單位:秒)

使用 max-stale 可指示緩存資源,即使過期也照常接收。 如果指令未指定參數值,那麼無論經過多久,客戶端都會接收響應; 如果指令中指定了具體數值,那麼即使過期,只要仍處於 max-stale 指定的時間內,仍舊會被客戶端接收

only-if-cached 指令

Cache-Control: only-if-cached

使用 only-if-cached 指令表示客戶端僅在緩存服務器本地緩存目標資 源的情況下才會要求其返回。換言之,該指令要求緩存服務器不重新 加載響應,也不會再次確認資源有效性。若發生請求緩存服務器的本 地緩存無響應,則返回狀態碼 504 Gateway Timeout。

must-revalidate 指令

Cache-Control: must-revalidate

使用 must-revalidate 指令,代理會向源服務器再次驗證即將返回的響 應緩存目前是否仍然有效。 若代理無法連通源服務器再次獲取有效資源的話,緩存必須給客戶端 一條 504(Gateway Timeout)狀態碼。 另外,使用 must-revalidate 指令會忽略請求的 max-stale 指令(即使已 經在首部使用了 max-stale,也不會再有效果)。

proxy-revalidate 指令

 Cache-Control: proxy-revalidate proxy-revalidate

指令要求所有的緩存服務器在接收到客戶端帶有該指 令的請求返回響應之前,必須再次驗證緩存的有效性。 no-transform 指令

   Cache-Control: no-transform 

使用 no-transform 指令規定無論是在請求還是響應中,緩存都不能改 變實體主體的媒體類型。 這樣做可防止緩存或代理壓縮圖片等類似操作。

2.Connection

connection字段具備的作用:

  • 控制不再轉發給代理的首部字段
  • 管理持久連接

(1).控制不再轉發給代理的首部字段
在這裏插入圖片描述

Connection: 不再轉發的首部字段名

在客戶端發送請求和服務器返回響應內,使用 Connection 首部字 段,可控制不再轉發給代理的首部字段(即 Hop-by-hop 首 部)。
(2). 管理持久連接
在這裏插入圖片描述

Connection: close

HTTP/1.1 版本的默認連接都是持久連接。爲此,客戶端會在持 久連接上連續發送請求。當服務器端想明確斷開連接時,則指定 Connection 首部字段的值爲 Close。
在這裏插入圖片描述

Connection: Keep-Alive

HTTP/1.1 之前的 HTTP 版本的默認連接都是非持久連接。爲 此,如果想在舊版本的 HTTP 協議上維持持續連接,則需要指定 Connection 首部字段的值爲 Keep-Alive。 如上圖①所示,客戶端發送請求給服務器時,服務器端會像上圖 ②那樣加上首部字段 Keep-Alive 及首部字段 Connection 後返回 響應。

3.Date

首部字段 Date 表明創建 HTTP 報文的日期和時間。
HTTP/1.1 協議使用在 RFC1123 中規定的日期時間的格式,如下 示 例:

Date: Tue, 03 Jul 2012 04:40:59 GMT

之前的 HTTP 協議版本中使用在 RFC850 中定義的格式,如下所示。

Date: Tue, 03-Jul-12 04:40:59 GMT

除此之外,還有一種格式。它與 C 標準庫內的 asctime() 函數的輸出 格式一致。

Date: Tue Jul 03 04:40:59 2012

4. Pragma

Pragma 是 HTTP/1.1 之前版本的歷史遺留字段,僅作爲與 HTTP/1.0 的向後兼容而定義。 規範定義的形式唯一,如下所示。

Pragma: no-cache

該首部字段屬於通用首部字段,但只用在客戶端發送的請求中。客戶 端會要求所有的中間服務器不返回緩存的資源。
在這裏插入圖片描述
所有的中間服務器如果都能以 HTTP/1.1 爲基準,那直接採用 Cache- Control: no-cache 指定緩存的處理方式是最爲理想的。但要整體掌握 全部中間服務器使用的 HTTP 協議版本卻是不現實的。因此,發送的 請求會同時含有下面兩個首部字段。

Cache-Control: no-cache
Pragma: no-cache

5.Trailer

在這裏插入圖片描述
首部字段 Trailer 會事先說明在報文主體後記錄了哪些首部字段。該 首部字段可應用在 HTTP/1.1 版本分塊傳輸編碼時。

在這裏插入圖片描述
以上用例中,指定首部字段 Trailer 的值爲 Expires,在報文主體之後 (分塊長度 0 之後)出現了首部字段 Expires。

6.Transfer-Encoding

在這裏插入圖片描述
首部字段 Transfer-Encoding 規定了傳輸報文主體時採用的編碼方式。 HTTP/1.1 的傳輸編碼方式僅對分塊傳輸編碼有效。
在這裏插入圖片描述
以上用例中,正如在首部字段 Transfer-Encoding 中指定的那樣,有效 使用分塊傳輸編碼,且分別被分成 3312 字節和 914 字節大小的分塊 數據。

7.Upgrade

首部字段 Upgrade 用於檢測 HTTP 協議及其他協議是否可使用更高的 版本進行通信,其參數值可以用來指定一個完全不同的通信協議。
在這裏插入圖片描述
上圖用例中,首部字段 Upgrade 指定的值爲 TLS/1.0。請注意此處兩 個字段首部字段的對應關係,Connection 的值被指定爲 Upgrade。 Upgrade 首部字段產生作用的 Upgrade 對象僅限於客戶端和鄰接服務 器之間。因此,使用首部字段 Upgrade 時,還需要額外指定 Connection:Upgrade。
對於附有首部字段 Upgrade 的請求,服務器可用 101 Switching Protocols 狀態碼作爲響應返回。

8.Warning

HTTP/1.1 的 Warning 首部是從 HTTP/1.0 的響應首部(Retry-After)演 變過來的。該首部通常會告知用戶一些與緩存相關的問題的警告。

Warning: 113 gw.hackr.jp:8080 "Heuristic expiration" Tue, 03 Jul 2012 05:09:44 GMT 

Warning 首部的格式如下。最後的日期時間部分可省略。

Warning: [警告碼][警告的主機:端口號][警告內容]”([日期時間]) 

HTTP/1.1 中定義了 7 種警告。警告碼對應的警告內容僅推薦參考。 另外,警告碼具備擴展性,今後有可能追加新的警告碼。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章