HTTP報文首部
??HTTP協議的請求和響應報文中必定包含HTTP首部。首部內容為客戶端和服務器分別處理請求和響應提供所需要的信息。
HTTP請求報文
??在請求中,HTTP報文由方法、URI、HTTP版本、HTTP首部字段等部分構成。HTTP響應報文
??在相應中,HTTP報文由HTTP版本、狀態碼(數字和原因短語)、HTTP首部字段3部分構成。??在報文眾多的字段中,HTTP首部字段包含的信息最為豐富。首部字段同時存在于請求和響應報文內,并涵蓋HTTP報文相關的內容信息。
HTTP首部字段
傳遞重要信息
??使用首部字段是為了給瀏覽器和服務器提供報文主體大小、所使用的語言、認證信息等內容。
HTTP首部字段結構
??由首部字段名和字段值構成的,中間用冒號分隔。
??另外,字段值對應單個HTTP首部字段可以有多個值,如下所示:
??Keep-Alive:timeout=15,max=100
??若HTTP報文首部中出現了兩個或兩個以上具有相同首部字段名時,根據瀏覽器內部處理邏輯的不同,結果可能不一致。
4種HTTP首部字段類型
根據實際用途分為:
- 通用首部字段:請求報文和響應報文兩方都會使用的首部
- 請求首部字段:補充了請求的附加內容、客戶端信息、響應內容相關優先級等信息
- 響應首部字段:補充了響應的附加內容,也會要求客戶端附加額外的內容信息
- 實體首部字段:針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體有關的信息
HTTP/1.1首部字段
-
通用首部字段image.png
-
請求首部字段image.png
-
響應首部字段image.png
-
實體首部字段image.png
非HTTP/1.1首部字段
Cookie、Set-Cookie和Content-Disposition等在其他RFC中定義的首部字段,使用頻率也很高。
End-to-end首部和Hop-by-hop首部
??HTTP首部字段將定義成緩存代理和非緩存代理的行為,分成2種類型。
- 端對端首部:分在此類別中的首部會轉發給請求/響應對應的最終接收目標,且必須保存在有緩存生成的響應中,另外規定它必須被轉發。
- 逐跳首部:分在此類別中的首部只對單次轉發有效,會因通過緩存或代理而不再轉發。HTTP/1.1和之后版本,如果要使用hop-by-hop首部,需提供Conection首部字段。
下面列舉出HTTP/1.1中的逐跳首部字段。除了這8個首部字段之外,其他所有字段都屬于端到端首部。
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
HTTP/1.1通用首部字段
Cache-Control
能操作緩存的工作機制。(指令的參數是可選的,多個指令之間通過‘,’分隔)首部字段Cache-Control的指令可用于請求及響應時。
- 表示是否能緩存的指令
- public:明確表示其他用戶也可利用緩存
- private:當指定private指令后,響應只以特定的用戶作為對象。緩存服務器會對該特定用戶提供資源緩存的服務。
- no-cache:防止從緩存中返回過期的資源
客戶端發送的請求中包含no-cache指令,表示客戶端將不會接收緩存過的響應。“中間”的緩存服務器必須把客戶端請求轉發給源服務器。
服務器返回的響應中包含no-cache,那么緩存服務器不能對資源進行緩存,源服務器以后也將不再對緩存服務器請求中提出的資源有效性進行確認,且禁止其對響應資源進行緩存操作。
Cache-Control: no-cache=Location
有服務器返回的響應中,若對no-cache字段名具體指定參數值,那么客戶端在接收到這個被指定參數值的首部字段對應的響應報文后,就不能使用緩存。換言之,無參數值的首部字段可以使用緩存。只能在相應指令中指定該參數。
- 控制可執行緩存的對象的指令
- no-store:暗示請求(和對應的響應)或響應中包含機密信息。因此,該指令規定緩存不能在本地存儲請求或響應的任意部分。
- 指定緩存期限和認證的指令
- s-maxage:其功能和max-age指令的相同(單位是s),不同點是s-maxage指令只適用于供多位用戶使用的公共緩存服務器。也就是說,對于向同一用戶重復返回響應的服務器來說,這個指令沒有任何作用。
另外,當使用s-maxage指令后,則直接忽略對Expores首部字段及max-age指令的處理。 - max-age:當客戶端發送的請求中包含max-age指令時,如果判定緩存資源的緩存時間數值比指定時間的數值更小,那么客戶端就接收緩存的資源。另外,當指定max-age值為0,那么緩存服務器通常需要將請求轉發給源服務器。
當服務器返回的響應中包含max-age指令時,緩存服務器將不對資源的有效性再作確認,而max-age數值代表資源保存為緩存的最長時間。
應用HTTP/1.1版本的緩存服務器遇到同時存在Expries首部字段的情況時,會優先處理max-age指令,而忽略掉Expries。但是HTTP/1.0版本的緩存服務器的情況卻相反。 - min-fresh:要求緩存服務器返回至少還未過指定時間(單位s)的緩存資源。比如,當指定min-fresh為60秒后,過了60秒的資源都無法作為響應返回了。
- max-stale:可指示緩存資源,即使過期也照常接收。如果指令為指定參數值,那么無論經過多久,客戶端都會接收響應。如果指定了具體數值,那么即使過期,只要仍處于max-stale指定的事件內,依舊會被客戶端接收。
- only-if-cached:表示客戶端僅在緩存服務器本地緩存目標資源的情況下才會要求其返回。換句話說,該指令要求緩存服務器不重新加載響應,也不會再次確認資源有效性。若發生請求緩存服務器的本地緩存無響應,則返回狀態碼504 Gateway Timeout
- must-revalidate:使用該指令,代理會向源服務器再次驗證即將返回的響應緩存目前是否仍然有效。若無法連通源服務器再次獲取有效資源的話,緩存必須給客戶端一條504狀態碼。
另外,使用must-revalidate會忽略請求的max-stale指令。 - proxy-revalidate:要求所有的緩存服務器在接收到客戶端帶有該指令的請求返回響應之前,必須再次驗證緩存的有效性。
- no-transform:無論在請求還是響應中,緩存都不能改變實體主體的媒體類型,這樣可以防止緩存或代理圖片等類似操作。
- Cache-Control拓展:
cache-extension token
Cache-Control:private,community="UCI"
通過cache-extension標記,可以拓展Cache-Contril首部字段內的指令。但是,extension tokens僅對能理解它的緩存服務器來說是有意義的。
Connection
- 控制不再轉發給代理的首部字段
在客戶端發送請求和服務器返回響應內,使用Connection首部字段,可控制不再轉發給代理的首部字段(即Hop-by-hop首部)。 - 管理持久連接
HTTP/1.1版本的默認連接都是持久連接。當服務器想明確斷開連接時,則指定Connection首部字段的值為Close。
HTTP/1.1之前的HTTP版本的默認連接都是非持久連接,則需要指定Connection首部字段的值為Keep-Alive。
Date
表示創建HTTP報文的日期和時間
Pragma
Pragma是HTTP/1.1之前版本的歷史遺留字段,僅作為與HTTP/1.0的向后兼容而定義。
形式唯一:Pragma:no-cache
該首部字段屬于通用首部字段,但只用在客戶端發送的請求中。客戶端會要求所有的中間服務器不返回緩存的資源。
Trailer
會事先說明在報文主體后記錄了哪些首部字段。該首部字段可應用在HTTP/1.1版本分塊傳輸編碼時。Transfer-Encoding
規定傳輸報文主體時采用的編碼方式
Upgrade
用于檢測HTTP協議及其他協議是否可使用更高的版本進行通信,其參數值可以用來指定一個完全不同的通信協議。使用首部字段Upgrade時,還需要額外指定Connection:Upgrade。
Via
為了追蹤客戶端與服務器之間的請求和響應報文的傳輸路徑。
報文經過代理或網關時,會先在首部字段Via中附加該服務器的信息,然后再進行轉發。首部字段Via不僅用于追蹤報文的轉發,還可避免請求回環的發生。所以必須在經過代理時附加該首部字段內容。
Via首部是為了追蹤傳輸路徑,所以經常會和TRACE方法一起使用。
Warning
HTTP/1.1的Warning首部是從HTTP/1.0的響應首部(Retry-After)演變過來的。該首部通常會告知用戶一些與緩存相關的問題的警告。請求首部字段
Accept
image.png
該字段可通知服務器,用戶代理能夠處理的媒體類型及媒體類型的相對優先級。可使用type/subtype這種形式,一次指定多種媒體類型。若想給顯示的媒體類型增加優先級,則使用q=來額外表示權重值,用分號(;)進行分隔。權重值q的范圍是0~1(可精確到小數點后三位),默認權重為1=1.0.
當服務器提供多種內容時,將會首先返回權重值最高的媒體類型。
Accept-Charset
用來通知服務器用戶代理支持的字符集及字符集的相對優先級。同樣可以指定多種字符集,也可使用權重q值表示相對優先級。
Accept-Encoding
用來告知服務器用戶代理支持的內容編碼及內容編碼的優先級順序,可一次性指定多種內容編碼。同樣可以用權重q值表示相對優先級,也可以使用*作為通配符。
Accept-Language
告知服務器用戶代理能夠處理的自然語言集及其優先級,可一次指定多種語言集,權重q值表示相對優先級。
Authorization
image.png
告知服務器,用戶代理的認證信息(證書值)。通常,想要通過服務器認證的用戶代理會在接收到返回的401狀態碼響應后,把首部字段Authorization加入請求中。共用緩存在接收到含有Authorization首部字段的請求時的操作處理會略有差異。
Expect
客戶端使用首部字段Expect告知服務器,期望出現的某種特定行為。因服務器無法理解客戶端的期望作出回應而發生錯誤時,會返回狀態碼417Expectation Failed。
客戶端可以利用該首部字段,寫明所期望的拓展。雖然HTTP/1.1規范只定義了100-continue(狀態碼100 Continue)。
等待狀態碼100響應的客戶端在發生請求時,需要指定Expect:100-continue。
From
告知服務器使用用戶代理的用戶的電子郵件地址。通常,其使用目的就是為了顯示搜索引擎等用戶代理的負責人的電子郵件聯系方式。使用代理時,應盡可能包含在From首部字段。(但可能會因為代理不同,將電子郵件地址記錄在User-agent首部字段內)。
Host
虛擬主機運行在同一個IP上,因此使用首部字段Host加以區分。
首部字段Host會告知服務器,請求的資源所處的互聯網主機名和端口號。Host首部字段在HTTP/1.1規范內是唯一一個必須被包含在請求內的首部字段。
請求被發送至服務器時,請求中的主機名會用IP地址直接替換解決。若服務器未設定主機名,那直接發送一個空值即可。
If-Match
形如If-xxx這種樣式的請求首部字段,都可稱為條件請求。服務器接收到附帶條件的請求后,只有判斷指定條件為真時,才會執行請求。首部字段If-Match,屬附帶條件之一,它會告知服務器匹配資源所用的實體標記(Etag)值。這時的服務器無法使用若Etag值。還可以使用*指定其字段值。針對這種情況,服務器將會忽略Etag的值,只要資源存在就處理請求。
If-Modified-Since
image.png
它會告知服務器,若If-Midified-Since字段值早于資源的更新時間,則希望能處理該請求。而在指定If-modified-Since字段值的日期時間之后,如果請求的資源都沒有更新,則返回狀態碼304Not Modified的響應。
If-Modified-Since 用于確認代理或客戶端擁有的本地資源的有效性。獲取資源的更新日期時間, 可通過確認首部字段 Last-Modified 來確定。
If-None-Match
image.png
在GET或HEAD方法中使用首部字段If-None-Match可獲取最新的資源。
If-Range
image.png
image.png
下面那種方式需要發送兩次請求。
If-Unmodified-Since
與首部字段If-Modified-Since作用相反。它的作用的是告知服務器, 指定的請求資源只有在字段值內指定的日期時間之后, 未發生更新的情況下, 才能處理請求。 如果在指定日期時間后發生了更新, 則以狀態碼 412 Precondition Failed 作為響應返回。
Max-Forwards
通過TRACE方法或OPTIONS方法,發送包含首部字段Max-Forwards收到的請求時,該字段以十進制整數形式指定可經過的服務器最大數目。
使用 HTTP 協議通信時, 請求可能會經過代理等多臺服務器。 途中,如果代理服務器由于某些原因導致請求轉發失敗, 客戶端也就等不到服務器返回的響應了。 對此, 我們無從可知。可以靈活使用首部字段 Max-Forwards, 針對以上問題產生的原因展開調查。 由于當 Max-Forwards 字段值為 0 時, 服務器就會立即返回響應, 由此我們至少可以對以那臺服務器為終點的傳輸路徑的通信狀況有所把握。
Proxy-Authorization
接受到從代理服務器發來的認證質詢時,客戶端會發送包含該首部字段的請求,已告知服務器認證所需要的信息。
這個行為是與客戶端和服務器之間的 HTTP 訪問認證相類似的, 不同之處在于, 認證行為發生在客戶端與代理之間。 客戶端與服務器之間的認證, 使用首部字段 Authorization 可起到相同作用。
Range
對于只需要獲取部分資源的范圍請求,包含首部字段Range即可告知服務器資源的指定范圍。
Referer
image.png
客戶端一般都會發送Referer首部字段給服務器。但當直接在瀏覽器地址輸入URI(可能含有ID和密碼等保密信息),出于安全性的考慮,也可以不發送該首部字段。
TE
告知服務器客戶端能夠處理相應的傳輸編碼方式及相對優先級。它和首部字段Accept-Encoding的功能很像,但是用于傳輸編碼。
首部字段TE出指定傳輸編碼之外,還可以指定伴隨trailer字段的分塊傳輸編碼的方式。應用后者時,只需把trailers賦值給該字段值。
User-Agent
將創建請求的瀏覽器和用戶代理名稱等信息傳達給服務器。
由網絡爬蟲發起請求時, 有可能會在字段內添加爬蟲作者的電子郵件地址。 此外, 如果請求經過代理, 那么中間也很可能被添加上代理服務器的名稱。
響應首部字段
Accept-Ranges
告知客戶端服務器是否能處理范圍請求,以指定獲取服務器daunt某個資源。字段值有兩種,可處理范圍請求時為bytes,反之為none。
Age
告知客戶端,源服務器在多久前創建了響應。字段值單位為秒。若創建該響應的服務器是緩存服務器,Age值是指緩存后的響應再次發起認證到認證完成的時間值。創建代理響應時必須加上該字段。
Etag
告知客戶端實體標識。它是一種可將資源以字符串形式做唯一性標識的方式。服務器會為每份資源分配對應的Etag值。
當資源更新,Etag值也需要更新,其算法規則,僅僅是由服務器來分配。
資源被緩存時,就會被分配唯一性標識,中文版和英文版瀏覽器返回的資源不一樣,所以僅憑URI指定緩存的資源是相當困難的。
- 強Etag值:不論實體發生多么細微的變化都會改變其值。
- 弱Etag值:只用于提示資源是否相同。只有資源發生了根本改變,產生差異時才會改變Etag值。這時會在字段值最開始處附加W/。
Location
image.png
將響應接收方引導至某個與請求URI位置不同的資源。基本上該字段會配合3xx:Redirection的響應,提供重定向的URI。
幾乎所有的瀏覽器在接收到包含首部字段Location的響應后,都會強制性的嘗試對已提示的重定向資源的訪問。
Proxy-Authenticate
把由代理服務器所要求的認證信息發送給客戶端。
Retry-After
告知客戶端應該在多久之后再次發送請求。主要配合狀態碼503 Service Unavailable響應,或3xx Redireact響應一起使用。
字段值可以指定為具體的日期時間(Wed, 04 Jul 2012 06: 34: 24GMT 等格式),也可以是創建響應后的秒數。
Server
告知客戶端當前服務器上安裝的HTTP服務器應用程序的信息。
Vary
image.png
可對緩存進行控制。源服務器會向代理服務器傳達關于本地緩存使用方法的命令。
從代理服務器接收到源服務器返回包含Vary指定項的響應之后,若要再進行緩存,僅對請求中含有相同Vary指定首部字段的請求返回緩存。即使對相同資源發起請求,但由于Vary指定的首部字段不相同,因此必須要從源服務器重新獲取資源。
WWW-Authenticate
用于HTTP訪問認證。告知客戶端適用于訪問請求URI所指定資源的認證方案和帶參數提示的質詢。狀態碼401 Unauthorized響應中,肯定帶有該首部字段。
實體首部字段
包含在請求報文和響應報文中的實體部分所使用的首部,用于補充內容的更新時間等與實體相關的信息。
Allow
通知客戶端能夠支持Request-URI指定資源的所有HTTP方法。當服務器收到不支持的HTTP方法時,會以狀態碼405Method Not Allowed作為響應返回。與此同時,還會把所有能支持的HTTP方法寫入首部字段Allow后返回。
Content-Encoding
告知客戶端服務器對實體的主體部分選用的內容編碼方式。內容編碼是指不丟失實體信息的前提下所進行的壓縮。
Content-Language
告知客戶端,實體主體使用的自然語言。
Content-Length
表明實體主體部分的大小(單位字節)。對實體主體進行內容編碼傳輸時,不能再使用Content-Length首部字段。
Content-Location
給出與報文主體部分相對應的URI。和首部字段Location不同,其表示的是報文主體返回資源對應的URI。
Content-MD5
image.png
是一串由MD5算法生成的值,其目的在于檢查報文主體在傳輸過程中是否保持完整,以及確認傳輸到達。(HTTP首部無法記錄二進制值,通過Base64編碼處理)
Content-Range
image.png
告知客戶端作為響應返回的實體的哪個部分符合范圍請求。字段值以字節為單位,表示當前發送部分及整個實體大小。
Content-Type
說明了實體主體內對象的媒體類型。和首部字段Accept一樣,字段值用type/subtype形式賦值。
Expires
將資源失效的日期告知客戶端。緩存服務器在接收到含有首部字段Expires的響應后,會以緩存來應答請求,在Expires字段值指定的時間之前,響應的副本會一直保存。當超過指定的時間后,會轉向源服務器請求資源。
源服務器不希望緩存服務器對資源緩存時,最好在該字段內寫入與首部字段Date相同的時間值。
但是,當首部字段Cache-Control有指定max-age指令時,比起該字段,會優先處理max-age指令。
Last-Modified
指明資源最終修改的時間。一般來說,這個值就是Request-URI指定資源被修改的時間。但類似使用CGI腳本進行動態數據處理時,該值有可能會變成數據最終修改時的時間。
為Cookie服務的首部字段
??Cookie的工作機制是用戶識別及狀態管理。Web網站為了管理用戶的狀態會通過Web瀏覽器,把一些數據 臨時寫入用戶的計算機內。接著當用戶訪問該Web網站時,可通過通信方式取回之前發放的Cookie。
Set-Cookie
當服務器準備開始管理客戶端的狀態時,會事先告知各種信息。- expires:指定瀏覽器可發送Cookie的有效期。當省略時,其有效期僅限于維持瀏覽器會話時間段內。這通常限于瀏覽器應用程序被關閉之前。
??另外,一旦Cookie從服務器發送至客戶端,服務器就不存在可以顯示刪除Cookie的方法。但可通過覆蓋已過期的Cookie,實現對客戶端Cookie的實質性刪除操作。 - path:用于限制指定Cookie的發送范圍的文件目錄。不過有辦法避開此限制。
- domain:指定的域名可做到與結尾匹配一致。比
如, 當指定 example.com 后, 除 example.com 以外, www.example.com或 www2.example.com 等都可以發送 Cookie。 - secure:用于限制Web頁面盡在HTTPS安全連接時,才可以發送Cookie。
發送Cookie時,指定secure屬性的方法如下:
Set-Cookie:name=value;secure
??當省略secure屬性時,不論HTTP還是HTTPS,都會對Cookie進行回收。
- HttpOnly:是Cookie的拓展功能,它使JS腳本無法獲得Cookie。其主要目的為防止跨站腳本攻擊對Cookie的信息竊取。
發送指定 HttpOnly 屬性的 Cookie 的方法如下所示:
Set-Cookie: name=value; HttpOnly
Cookie
Cookie:status=enable
告知服務器,當客戶端想獲得HTTP狀態管理支持時,就會在請求中包含從服務器接收到的Cookie。接收到多個Cookie時,同樣可以以多個Cookie形式發送。
其他首部字段
HTTP首部字段是可以自行拓展的。所以在Web服務器和瀏覽器的應用上,會出現各種非標準的首部字段。
X-Frame-Options
屬于HTTP響應首部,用于控制網站內容在其他Web網站的Frame標簽內的顯示問題。其主要目的是為了防止點擊劫持攻擊。
可指定的字段值:
- DENY:拒絕
- SAMEORIGIN:僅同源域名下的頁面匹配時許可
現在主流的瀏覽器都已經支持。
####### X-XSS-Protection
屬于HTTP響應首部,它是針對跨站腳本攻擊(XSS)的一種對策,用于控制瀏覽器XSS防護機制的開關。
可指定的字段值: - 0:將XSS過濾設置成無效狀態
- 1:將XSS過濾設置成有效狀態
DNT
屬于HTTP請求首部,是Do Not Track的簡稱,意為拒絕個人信息被收集,是表示拒絕被精準廣告追蹤的一種方法。
可指定的字段值:
- 0:同意被追蹤
- 1:拒絕被追蹤
Web服務器需要對DNT做對應的支持
p3p
屬于HTTP響應