HTTP首部
HTTP報文首部結(jié)構(gòu)
復習一下前邊的知識:
HTTP報文大致可分為報文首部和報文主體兩塊,通常并不一定要有報文主體
請求報文及響應報文的結(jié)構(gòu)
請求報文結(jié)構(gòu)如下:
- 報文首部
- 請求行
- 請求首部字段
- 通用首部字段
- 實體首部字段
- 其他(如Cookie)
- 空行換行(CR+LF)
- 報文主體
響應報文結(jié)構(gòu)如下:
- 報文首部
- 狀態(tài)行
- 響應首部字段
- 通用首部字段
- 實體首部字段
- 其他(如Cookie)
- 空行換行(CR+LF)
- 報文主體
HTTP首部字段
HTTP首部字段是構(gòu)成HTTP報文的要素之一,它給瀏覽器和服務器提供報文主體大小、所使用的語言篮绿、認證信息等內(nèi)容
HTTP首部字段結(jié)構(gòu)
HTTP首部字段由首部字段名和字段值構(gòu)成,中間用冒號“:”分隔
首部字段名:字段值
, 例如:Content-Type:text/html
同一個字段名可以有多個字段值,如:
Keep-Alive:timeout=15, max=100
HTTP首部字段類型
HTTP首部字段根據(jù)實際用途被分為以下4種類型
- 通用首部字段
- 請求首部字段
- 相應首部字段
- 實體首部字段
HTTP/1.1 首部字段一覽
HTTP/1.1規(guī)范定義了如下47種首部字段
除了這47種七冲,還有Cookie、Set-Cookie和Content-Disposition等其他RFC種定義的首部字段用的比較多
End-to-End首部和Hop-by-hop首部
HTTP首部字段將定義成緩存代理和非緩存代理的行為分成2種:
端到端首部 和 逐跳首部
HTTP/1.1 通用首部字段
Cache-Control
Cache-Control能夠控制緩存的行為规婆,Cache-Control指令一覽
緩存請求指令:
- max-age(秒):響應的最大age值
- min-fresh: 期望在指定時間內(nèi)的響應仍有效
- max-stale:接收已過期的響應
- no-cache:不接收緩存的數(shù)據(jù)
- no-store:不緩存任何內(nèi)容
- no-transform:代理不可更改媒體類型
- only-if-cached:只從代理的緩存獲取資源
- cache-extension:新指令標記
緩存響應指令:
- public:可向任意方提供響應
- private:僅向特定用戶返回響應
- no-cache:緩存前必須確認其有效性
- no-store:不緩存任何內(nèi)容
- no-transform:代理不可更改媒體類型
- must-revalidate:可緩存但必須向源服務器進行確認
- proxy-revalidate:
- max-age:響應的最大Age值
- s-maxage:公共緩存服務器響應的最大Age值
- cache-extension:新指令標記
Connection
Connection首部字段具備如下兩個作用:
- 管理持久連接
- 控制不再轉(zhuǎn)發(fā)給代理的首部字段
HTTP/1.1之前版本的默認連接都是非持久連接澜躺,如果要在舊版本的HTTP協(xié)議上維持持續(xù)連接,則需要指定Connection:Keep-Alive
Connection:close
表示斷開連接
Date
首部字段Date表明創(chuàng)建報文的日期和時間
Transfer-Encoding
首部字段Transfer-Encoding規(guī)定了傳輸報文主體時采用的編碼方式
HTTP/1.1的傳輸編碼方式僅對分塊傳輸編碼有效
Via
Via記錄了客戶端和服務器之間的請求和響應報文的傳輸路徑
Upgrade
Upgrade用于檢測HTTP協(xié)議及其他協(xié)議是否可使用更高的版本進行通信抒蚜,其參數(shù)值可以用來指定一個完全不同的通信協(xié)議
Trailer
Trailer說明了在報文主體后記錄了哪些首部字段
Warning
該首部通常會告知用戶一些與緩存相關的問題警告
請求首部字段
Host
Host表示資源所處的互聯(lián)網(wǎng)主機名和端口號掘鄙,該字段是HTTP/1.1規(guī)范內(nèi)唯一一個必須被包含在請求內(nèi)的首部字段
Accept
Accetp首部字段可通知服務器,客戶端能夠處理的媒體類型及媒體類型的優(yōu)先級嗡髓,可使用type/subtype這種形式操漠,一次可以指定多種媒體類型
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
舉幾個常見媒體類型的例子:
- 文本文件
text/html, text/plain, text/css
application/xhtml+xml, application/xml - 圖片文件
image/jpeg, image/png, image/gif - 視頻文件
video/mpeg, video/quicktime - 應用程序使用的二進制文件
application/octet-stream, application/zip
q=0.9表示權重,默認值為1.0饿这,且1為最大值浊伙。當服務器提供多種內(nèi)容時,將會首先返回權重高的媒體類型
Accept-Charset
Accept-Charset首部字段可用來通知服務器客戶端支持的字符集及優(yōu)先順序长捧,用q值來表示相對優(yōu)先級
Accept-Charset:iso-8859-5, utf-8;q=0.8
Accept-Encoding
Accept-Encoding用來告知服務器客戶端支持的內(nèi)容編碼及優(yōu)先級順序嚣鄙,可一次性指定多種內(nèi)容編碼,常見的集中編碼格式:
- gzip
- compress
- deflate
- identity
采用q值來表示優(yōu)先級串结,可使用星號*指定任意格式的編碼格式
Accept-Language
Accept-Language告知服務器客戶端能夠處理的自然語言集哑子,可用q值表示優(yōu)先級
Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3
User-Agent
User-Agent會將客戶端的瀏覽器和其他信息發(fā)送給服務器
Authorization
Authorization用來告知服務器客戶端的認證信息(證書值)
Proxy-Authorization
此認證發(fā)生在客戶端和代理之間
From
客戶端的郵件地址
If-Match
形如If-xxx這種形式的請求首部字段,都可成為條件請求肌割。服務器接收到附帶條件的請求后赵抢,只有判斷指定條件為真時,才會執(zhí)行請求
If-Match的字段值會和服務器端實體標記ETag匹配声功,一致時服務器才會接受請求烦却,反之則返回狀態(tài)碼412 Precondition Failed
If-Modified-Since
if-none-match
與if-match的作用相反,只有在if-none-match字段值與ETag值不一致時才處理該請求
在Get或Head方法中使用if-none-match可獲取最新的資源
If-Range
If-Unmodified-Since
與If-Modified-Since的作用相反
Max-Forwards
Max-Forwards:5
每次轉(zhuǎn)發(fā)數(shù)值減1先巴,當數(shù)值變成0時返回響應其爵。可以避免由于位置原因而導致的請求陷入循環(huán)
Range
Range:bytes=5001-10000
對于只需獲取部分資源的范圍請求伸蚯,包含首部字段Range即可告知服務器資源的指定范圍
接收到Range首部字段請求的服務器摩渺,會在請求之后返回狀態(tài)碼206 Partial Content的響應,無法處理該范圍請求時剂邮,則會返回200 ok的響應及全部資源
Referer
Referer會告知服務器請求的原始資源的URI摇幻,其中可能含有ID和密碼等保密信息,寫進Referer有可能導致泄密
TE
TE:gzip, deflate;q=0,5
TE會告知服務器客戶端能夠處理響應的傳輸編碼方式及優(yōu)先級,而Accept-encoding怎表示內(nèi)容的編碼的方式
還可指定伴隨Trailer字段的分塊傳輸編碼的方式
響應首部字段
Accept-Ranges
Accept-Ranges是用來告知客戶端服務器是否能處理范圍請求绰姻,以指定獲取服務器端某個部分的資源
可指定的字段有兩種枉侧,可處理范圍請求時為bytes,反之為none
Accept-Ranges:bytes
Age
Age:60
Age告知客戶端狂芋,源服務器在多久前創(chuàng)建了響應榨馁,單位是秒
ETag
ETag:"82ec22325w"
ETag是資源的唯一標識,以字符串方式表示帜矾,服務器會為每份資源分配對應的ETag值翼虫。當資源更新時,ETag值也需要更新
強ETag和弱ETag
- 強ETag
無論實體發(fā)生多么細微的變化都會改變其值 - 弱ETag
只有資源發(fā)生了根本改變屡萤,產(chǎn)生差異時才會改變ETag值珍剑,在字段開始處附加W/ETag:W/"usagi-1234"
Location
Location可以將響應接收方引導至某個新的URI,基本上死陆,該字段會配合3XX的響應招拙,提供重定向的URI
Server
Server表示了服務器上安裝的HTTP服務器應用程序的信息
Server: Apache/2.2.6(Unix) PHP/5.2.5
Retry-after
Retry-after: 120(或是日期時間)
告知客戶端應該在多久之后再次發(fā)送請求,配合503 或 3xx一起使用
WWW-Atuthenticate
WWW-Atuthenticate: Basic realm="usagidesign Auth"
WWW-Atuthenticate用于HTTP訪問認證翔曲,它會告知客戶端適用于訪問請求URI的認證方案
Proxy-Atuthenticate
和WWW-Atuthenticate一樣迫像,不過是發(fā)生在客戶端和代理之間
Vary
Vary: Accept-Language
Vary可以控制代理的緩存,只返回Accept-Language值相同的緩存
實體首部字段
Allow
405 Method Not Allowed
Allow: GET, POST
該字段用于通知客戶端能夠支持的Request的HTTP方法瞳遍,當服務器接收到不支持的HTTP方法時闻妓,返回405 Method Not Allowed作為響應,同時將支持的方法寫入Allow返回
Content-Location
與Location不同掠械,Content-Location表示的是報文主體返回資源對應的URI
Content-Encoding
Content-Encoding: gzip
Content-Encoding表示實體主體的編碼方式
Content-Language
Content-Language表示主體使用的自然語言
Content-Length
Content-Length表明了實體主體的大小由缆,單位是字節(jié)。如果主體進行了編碼傳輸猾蒂,則不再使用此字段
Content-MD5
Content-MD5是一串由MD5算法生成的值均唉,其目的在于檢查報文主體在傳輸過程中是否保持完整,以確認傳輸?shù)竭_
對報文主體執(zhí)行MD5算法獲得128位二進制數(shù)肚菠,再通過Base64編碼后將結(jié)果寫入Content-MD5字段舔箭,由于HTTP首部無法記錄二進制值,所以要通過Base64編碼蚊逢。接收方收到后對報文主體再執(zhí)行一次相同的MD5算法层扶,通過比較值來判斷主體的準確性
有被篡改的可能
Content-type
Content-type: text/html; charset=UTF-8
和Accept一樣,Content-type表示了實體主體對象的媒體類型
Content-Range
針對范圍請求烙荷,返回響應時使用Content-Range可以告知客戶端返回的哪個范圍镜会,單位是字節(jié)
Expires
Expires: Wed, 04 Jul 2012 08:26:05 GMT
Expires表示了資源的有效期,如果在有效期內(nèi)终抽,緩存服務器會以緩存來應答請求戳表,如果過了有效期則從源服務器請求資源桶至。
如果不希望緩存服務器對資源緩存時,則將Expires值和Date值設置為相等
當首部字段Cache-Control有指定max-age時匾旭,會優(yōu)先處理max-age
Last-Modified
Last-Modified: Thurs, 30 Jun 2016 18:00:00 GMT
Last-Modified表示資源最終修改的時間
為Cookie服務的首部字段
Set-Cookie
Set-Cookie: status=enable; expires=Thurs, 30 Jun 2016 18:00:00 GMT; path=/; domain=.hackr.jp;
下面是一個Set-Cookie的例子:
Set-Cookie: laravel_session=eyJpdiI6IjJnN1Rwd;
expires=Thu, 30-Jun-2016 12:37:37 GMT;
Max-Age=7200;
path=/;
HttpOnly
Cookie
Cookie: laravel_session=eyJpdiI6IjJnN1Rwd
客戶端接收到的服務器端發(fā)送的Cookie
其他首部字段
- X-Frame-Options
- X-XSS-Protection
- DNT
- P3P
X-Frame-Options
該字段屬于響應首部镣屹,用于控制網(wǎng)站內(nèi)容在其他web網(wǎng)站的Frame標簽內(nèi)的顯示問題,主要目的是為了防止點擊劫持攻擊
有兩個字段值:
- DENY
拒絕 - SAMEORIGIN
僅同域名下的頁面匹配時許可
X-XSS-Protextion
X-XSS-Protextion: 1
該字段屬于響應首部季率,踏實針對跨站腳本攻擊(XSS)的一種對策野瘦,用0和1來控制瀏覽器XSS防護機制的開關
P3P
該字段屬于響應首部描沟,通過利用P3P技術飒泻,可以讓web網(wǎng)站上的個人隱私編程一種僅供程序可理解的形式,以達到保護用戶隱私的目的
DNT
DNT: 1
該字段屬于請求首部吏廉,DNT是Do not track的簡稱泞遗,意為拒絕個人信息被收集,用0和1來控制席覆,可以拒絕被精準廣告追蹤
補充說明:
Accept和content-type的區(qū)別史辙,accept表示發(fā)送方(客戶端)希望接收的資源類型,而content-type表示發(fā)送方發(fā)送的資源類型