圖解HTTP——HTTP首部(學習記錄8)

HTTP報文首部:

HTTP協議的請求和響應報文中必定包含HTTP首部。首部內容為客戶端和伺服器分別處理請求和響應提供所需要的資訊。對於客戶端使用者來說,這些資訊中的大部分內容都無須親自檢視。

HTTP請求報文:

HTTP響應報文:

HTTP首部欄位結構是由首部欄位名和欄位值構成的,中間用冒號“:”分隔(欄位值對應單個HTTP首部欄位可以有多個值)

   首部欄位名:欄位值

4種HTTP首部欄位型別(根據實際用途劃分):

   1、通用首部欄位:請求報文和響應報文兩方都會使用的首部

Cache-Control通過指定首部欄位Cache-Control的指令,就能操作快取的工作機制。指令的引數是可選的,多個指令之間用“,”分隔,首部欄位Cache-Control的指令可用於請求及響應時。

no-cache指令目的是為了防止從快取中返回過期的資源。(客戶端傳送的請求包含no-cache,客戶端不會接收快取過的響應,於是,“中間”的快取伺服器必須把客戶端請求轉發給源伺服器。伺服器端返回的響應包含no-cache,快取伺服器不能對資源進行快取,源伺服器以後也不會對快取伺服器請求中提出的資源有效性進行確認,且禁止其對相應資源進行快取操作)

no-store指令,規定快取不能在本地儲存請求或相應的任一部分。

指定快取期限和認證的指令:

s-maxage指令的功能與max-age指令的相同,不同點在於s-maxage指令只適合用於供多位使用者使用的公共快取伺服器(一般指代理) 。

max-age指令,當客戶端傳送的請求中包含max-age指令時,如果判定快取時間數值比指定的時間的數值更小,那麼客戶端就接收快取的資源。當伺服器返回的響應中包含max-age指令時,快取伺服器將不對資源的有效性再作確認,而max-age數值代表資源保持為快取的最長時間。

min-fresh指令,要求快取伺服器返回至少還未過指定時間的快取資源。

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

only-if-cached指令,表示客戶端僅在寒蟬伺服器本地快取目標資源的情況下才會要求其返回。

must-revalidate指令,代理會向源伺服器再次驗證即將返回的響應快取目標是否仍然有效。

proxy-revalidate指令,要求所有的快取伺服器在接收到客戶端帶有該指令返回響應之前,必須再次驗證快取的有效性。

no-transform指令,規定無論是在請求還是響應中,快取都不能改變實體主體的媒體型別。

cache-extension token,可以擴充套件Cache-Control首部欄位內的指令。(extension tokens僅對能理解它的快取伺服器來說是有意義的)

Connection首部欄位具備如下兩個作用: 

                               1、控制不再轉發給代理的首部欄位(即Hop-by-hop首部)

                                    Connection:不再轉發的首部欄位名

                               2、管理持久連線(HTTP/1.1版本預設連線都是持久連線,為此,客戶端會在持久連線上連續傳送請求,當伺服器想明確斷開連線時,則指定Connection首部欄位的值為close。)

                                     Connection:close                            

Date:表明建立HTTP報文的日期和時間(使用RFC1123中規定的日期時間的格式,如Date:Tue,03 Jul 2012 04:40:59 GMT)

Pragma是HTTP/1.1之前版本的歷史遺留欄位,僅作為與HTTP/1.0的向後相容而定義

     Pragma:no-cache

該首部欄位屬於通用首部欄位,但只用在客戶端傳送的請求中。客戶端會要求所有的中間伺服器不返回快取的資源。

Trailer會事先說明在報文主體後記錄了哪些首部欄位。(該首部欄位可應用在HTTP/1.1版本分塊傳輸編碼時)

Transfer-Encoding規定了傳輸報文主體時採用的編碼方式。(HTTP/1.1的傳輸編碼方式僅對分塊傳輸編碼有效)

Upgrade用於檢測HTTP協議及其他協議是否可使用更高的版本進行通訊,其引數值可以用來指定一個完全不同的通訊協議。(Upgrade首部欄位產生作用的Upgrade物件僅限於客戶端和鄰接伺服器之間。因此,使用首部欄位Upgrade時,還必須額外指定Connection:Upgrade)

Via:為了追蹤客戶端與伺服器之間的請求和響應報文的傳輸路徑。(還可避免請求迴環的傳送)

報文經過代理或閘道器時,會先在首部欄位Via中附加該伺服器的資訊,然後再進行轉發。Via首部是為了追蹤傳輸路徑,所以經常會和TRACE方法(回顯伺服器收到的請求,主要用於測試或診斷)一起使用。

Warning:通常會告知使用者一些與快取相關的問題的警告

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

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

   2、請求首部欄位:從客戶端向伺服器傳送請求報文時所使用的首部,補充了請求的附加內容、客戶端資訊、響應內容相關優先順序等資訊。

Accept首部欄位可通知伺服器,使用者代理能夠處理的媒體型別及媒體型別的相對優先順序。(若是想要給顯示的媒體型別增加優先順序,則使用q=來額外表示權重值,使用分號分隔。權重值q的範圍是0-1,預設為q=1.0)

Accept-Charset可用來通知伺服器代理支援的字符集以及字符集的相對優先順序,使用q來表示權重。(應用於內容協商機制的伺服器驅動協商)

Accept-Encoding用來告知伺服器使用者代理支援的內容編碼及內容編碼的優先順序順序,使用q來表示權重(可使用*作為萬用字元)。

Accept-Language用來告知伺服器使用者代理能夠處理的自然語言集(指中文或英文等),以及自然語言集的相對優先順序,使用q來表示權重。

Authorization是用來告知伺服器使用者代理的認證資訊(認證值)。

Host告知伺服器,請求的資源所處的網際網路主機名和埠號,是唯一一個必須包含著請求內的首部欄位(虛擬主機執行中同一個IP上,因此使用首部欄位Host加以區分)

形如If-XXX這種形式的請求首部欄位,都可以稱為條件請求。伺服器接收到附帶條件的請求後,只有判斷指定條件為真時,才會執行請求。

If-Match的欄位值跟ETag值匹配一致時,伺服器才會接受請求,否則返回412狀態碼

If-None-Match的欄位值與ETag值不一致時,可以處理該請求,與If-Match首部欄位的作用相反

If-Range欄位值若是跟ETag值或更新的日期時間匹配一致,那麼就作為範圍請求處理,若不一致,則忽略範圍請求,返回全部資源。如果不使用If-Range,則需要進行兩次處理。

Max-Forwards以十進位制整數的形式指定可經過的伺服器最大數目,每次轉發數值減1,當數值變0時返回響應。

Range對於只需獲取部分資源的範圍請求,包含首部欄位Range即可告知伺服器資源的指定範圍。接收到附帶Range首部欄位請求的伺服器,會在處理請求之後返回狀態碼為206 Partial Content的響應。無法處理該範圍請求時,則會返回狀態碼200 OK的響應及全部資源。

Referer會告知伺服器請求的原始資源的URI,只要檢視Referer就能知道請求的URI是從哪個Web頁面發起的。

TE會告知伺服器客戶端能夠處理響應的傳輸編碼方式及相對優先順序,還可以指定伴隨trailer欄位的分塊傳輸編碼的方式(只需要把trailers賦值給該欄位值)。

User-Agent會將建立請求的瀏覽器和使用者代理名稱等資訊傳達給伺服器。

   3、響應首部欄位:從伺服器端向客戶端返回響應報文時使用的首部,補充了響應的附加內容,也會要求客戶端附加額外的內容資訊。

Accept-Ranges是用來告知客戶端伺服器是否能處理範圍請求,以指定獲取伺服器端某個部分的資源(可處理範圍請求時指定其為bytes,反之則指定為none)。

Age告知客戶端,源伺服器在多久前建立了響應,單位為秒。若建立該響應的伺服器是快取伺服器,Age值是指快取後的響應再次發起認證到認證完成的時間值。代理建立響應時必須加上首部欄位Age。

ETag告知客戶端實體標誌。它 一種可將資源以字串形式做唯一性標識的方式,伺服器會為每份資源分配對應的ETag值(當資源更新時,ETag值也需要更新)

Location可以將響應接收方引導至某個與請求URI位置不同的資源,幾乎所有的瀏覽器中接收到包含首部欄位Location的響應後,都會強制性的嘗試對已提示的重定向資源的訪問。

Retry-After告知客戶端應該在多久之後再次傳送請求,主要配合狀態碼503 Service Unavailable響應,或3XX Redirect響應一起使用。(欄位值可以指定為具體的日期時間,也可以是建立響應後的秒數)

Server告知客戶端當前伺服器上安裝的HTTP伺服器應用程式的資訊。

Vary可對快取進行控制。源伺服器會向代理伺服器傳達關於本地快取使用方法的命令。(從代理伺服器接收到源伺服器返回包含Vary指定項的響應之後,若再要進行快取,僅對請求中含有相同Vary指定首部欄位的請求返回快取。即使對相同的資源發起請求,但由於Vary指定的首部欄位不相同,因此必須要從源伺服器重新獲取資源)

   4、實體首部欄位:針對請求報文和響應報文的實體部分使用的首部,補充了資源內容更新時間等與實體有關的資訊。

Content-Encoding會告知客戶端伺服器對實體的主體部分選用的內容編碼方式(內容編碼是指在不丟失實體資訊的前提下所進行的壓縮。對實體主體進行內容編碼傳輸時,不能再使用Content-Length首部欄位)。

Content-Location給出與報文主體部分相對應的URI。和首部資源Location不同,Content-Location表示的是報文主體返回資源對應的URI。

Content-MD5是一串由MD5演算法生成的值,其目的在於檢查報文主體在傳輸過程中是否保持完整,以及確認傳輸到達。(客戶端會對接收的報文主體執行相同的MD5演算法,然後與首部欄位Content-MD5的欄位值比較)

Expires會將資源失效的日期告知客戶端。快取伺服器在接收到Expires的響應後,會以快取來應答請求,在Expires欄位值指定的時間之前,響應的副本會一直被儲存。當超過指定的時間後,快取伺服器會在請求傳送過來時,會轉向源伺服器請求資源。

End-to-end首部和Hop-by-hop首部:HTTP首部欄位將定義成快取代理和非快取代理的行為,分為兩種型別

1、端到端首部(End-to-end Header)

      首部會轉發給請求/響應對於的最終接受目標,且必須儲存在由快取生成的響應中,另外規定它必須被轉發。

2、逐跳首部(Hop-by-hop Header)

      首部只對單詞轉發有效,會因通過快取或代理而不再轉發。如果需要使用Hop-to-hop首部,需提供Connection首部欄位

為Cookie服務的首部欄位

Cookie的工作機制是使用者識別及狀態管理,Web網站為了管理使用者的狀態會通過Web瀏覽器,把一些資料臨時寫入使用者的計算機內。

Set-Cookie

       1、expires屬性指定瀏覽器可傳送Cookie的有效期。(若省略則有效期僅侷限於維持瀏覽器會話(Session)時間段內,這通常侷限於瀏覽器應用程式被關閉之前。)

       2、path屬性可用於限制指定的Cookie的傳送範圍的檔案目錄(將伺服器上的檔案目錄作為Cookie的適用物件,若不指定則預設為文件所在的檔案目錄)

       3、domain屬性指定的域名可做到與結尾匹配一致。(若不指定則預設為建立Cookie的伺服器的域名)

       4、secure屬性用於限制Web頁面僅在HTTPS安全連線時,才可以傳送Cookie(當省略secure時,不論HTTP還是HTTPS,都會對Cookie進行回收)

       5、HttpOnly是Cookie的擴充套件功能,它使JavaScript指令碼無法獲得Cookie,其主要目的是為防止跨站指令碼攻擊對Cookie的資訊竊取

Cookie會告知伺服器,當客戶端想獲得HTTP狀態管理支援時,就會在請求中包含從伺服器接收到的Cookie,接收到多個Cookie時,同樣可以以多個Cookie形式傳送。