揭開HTTP網(wǎng)絡(luò)協(xié)議神秘面紗系列(三)
HTTP首部字段有四種類型:通用首部字段,請(qǐng)求首部字段,響應(yīng)首部字段,實(shí)體首部字段。
通用首部字段:
首部字段 | 說明 |
---|---|
Cache-Control | 控制緩存的行為 |
Connection | 逐跳首部、連接的管理 |
Date | 創(chuàng)建報(bào)文的日期時(shí)間 |
Pragma | 報(bào)文指令 |
Trailer | 報(bào)文末端的首部一覽 |
Transfer-Encoding | 指定報(bào)文主體的傳輸編碼方式 |
Upgrade | 升級(jí)為其他協(xié)議 |
Via | 代理服務(wù)器的相關(guān)信息 |
Warning | 錯(cuò)誤通知 |
請(qǐng)求首部字段:
首部字段 | 說明 |
---|---|
Accept | 用戶代理的媒體類型 |
Accept-Charset | 優(yōu)先的字符集 |
Accept-Encoding | 優(yōu)先的內(nèi)容編碼 |
Accept-Language | 優(yōu)先的語言 |
Authorization | Web認(rèn)證信息 |
Expect | 期待服務(wù)器的特定行為 |
From | 用戶的電子郵件 |
Host | 請(qǐng)求資源所在服務(wù)器 |
if-Match | 比較實(shí)體標(biāo)記(ETag) |
if-Modified-Since | 比較資源的更新時(shí)間 |
if-None-Match | 比較實(shí)體標(biāo)記(與if-Match相反) |
if-Range | 資源未更新時(shí)發(fā)送實(shí)體Byte的范圍請(qǐng)求 |
if-Unmodified-Since | 比較資源的更新時(shí)間(與if-Modified-Since想法) |
Max-Forwards | 最大傳輸逐跳 |
Proxy-Authorization | 代理服務(wù)器要求客戶端的認(rèn)證信息 |
Range | 實(shí)體的字節(jié)范圍請(qǐng)求 |
Refer | 對(duì)請(qǐng)求中URI的原始獲取方 |
TE | 傳輸編碼的優(yōu)先級(jí) |
User-Agent | HTTP客戶端的信息 |
響應(yīng)首部字段:
首部字段 | 說明 |
---|---|
Accept-Ranges | 是否接受字節(jié)范圍請(qǐng)求 |
Age | 推算資源創(chuàng)建經(jīng)過時(shí)間 |
ETag | 資源匹配信息 |
Location | 令客戶端重定向至指定URI |
Proxy-Authenticate | 代理服務(wù)器對(duì)客戶端的認(rèn)證信息 |
Retry-After | 對(duì)再次發(fā)起請(qǐng)求的時(shí)機(jī)要求 |
Server | HTTP服務(wù)器的安裝信息 |
Vary | 代理服務(wù)器緩存的管理信息 |
WWW-Authenticate | 服務(wù)器對(duì)客戶端的認(rèn)證信息 |
實(shí)體首部字段:
首部字段 | 說明 |
---|---|
Allow | 資源可支持的HTTP方法 |
Content-Encod | 實(shí)體主體適用的編碼方式 |
Content-Language | 實(shí)體主體的自然語言 |
Content-Length | 實(shí)體主體的大小 |
Content-Location | 替代對(duì)飲資源的URI |
Content-MD5 | 實(shí)體主體的報(bào)文摘要 |
Content-Range | 實(shí)體主體的位置范圍 |
Content-Type | 實(shí)體主體的媒體類型 |
Expires | 實(shí)體主體過期的日期時(shí)間 |
Last-Modified | 資源的最后修改日期時(shí)間 |
#p#
HTTP首部字段將定義成緩存代理和非緩存代理兩種類型:
端到端(End-to-end Header):此類中的首部字段會(huì)轉(zhuǎn)發(fā)給請(qǐng)求/響應(yīng)對(duì)應(yīng)的最終接受目標(biāo),且必須在由緩存生成的響應(yīng)中,另外規(guī)定它必須被轉(zhuǎn)發(fā)。
逐跳首部(Hop-by-hop Header):此類中的首部只對(duì)單次轉(zhuǎn)發(fā)有效,會(huì)因通過緩存或代理而不再轉(zhuǎn)發(fā)。如:Connection,Keep-Alive,Upgrade,Proxy-Authenticate,Proxy-Authorization等。
當(dāng)有多個(gè)指令參數(shù)時(shí),多個(gè)指令之間可通過”,”分隔,例如首部字段Cache-Control:
Cache-Control: private,max-age=0,no-cache
Cache-Control指令一覽:
緩存請(qǐng)求指令:
指令 | 參數(shù) | 說明 |
---|---|---|
no-cache | 無 | 強(qiáng)制向源服務(wù)器再次驗(yàn)證 |
no-store | 無 | 不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容 |
max-age=[秒] | 必需 | 響應(yīng)的最大Age值 |
max-stale=[秒] | 可省略 | 接受已過的響應(yīng) |
min-fresh=[秒] | 必需 | 期望在指定時(shí)間內(nèi)的響應(yīng)仍有效 |
no-transform | 無 | 代理不可更改媒體類型 |
only-if-cache | 無 | 從緩存獲取資源 |
cache-extension | - | 新指令標(biāo)記 |
緩存響應(yīng)指令:
指令 | 參數(shù) | 說明 |
---|---|---|
public | 無 | 可向任意方提供響應(yīng)的緩存 |
private | 可省略 | 僅向特定用戶返回響應(yīng) |
no-cache | 可省略 | 緩存前必須先確認(rèn)其有效性 |
no-store | 無 | 不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容 |
no-transform | 無 | 代理不可更改媒體類型 |
msut-revalidate | 無 | 可緩存但必須再向源服務(wù)器進(jìn)行確認(rèn) |
proxy-revalidate | 無 | 要求中間緩存服務(wù)器對(duì)緩存的響應(yīng)有效性再進(jìn)行確認(rèn) |
max-age=[秒] | 必需 | 響應(yīng)的最大Age值 |
s-maxage=[秒] | 必需 | 公共緩存服務(wù)器響應(yīng)的最大Age值 |
cache-extension | - | 新指令標(biāo)記[token] |
Connection首部字段有兩個(gè)作用:
控制不再轉(zhuǎn)發(fā)給代理的首部字段,如:Connection:不再轉(zhuǎn)發(fā)的首部字段名.
管理持久化連接,HTTP/1.1默認(rèn)是持久連接,如果想斷開連接,可以用Connection: Close.
首部字段Upgrade用于檢測(cè)HTTP協(xié)議及其他協(xié)議是否可使用更高的版本進(jìn)行通信,其參數(shù)值可以用來指定一個(gè)完全不同的通信協(xié)議,不過產(chǎn)生對(duì)象僅限于客戶端和鄰接服務(wù)器之間。
首部字段Warning來告知用戶一些與緩存相關(guān)的問題的警告,其格式:Warning:[警告碼][警告的主機(jī):端口號(hào)][警告內(nèi)容]([日期時(shí)間])。
警告碼:
警告碼 | 警告內(nèi)容 | 說明 |
---|---|---|
110 | Response is stale(響應(yīng)已過期) | 代理返回已過期的資源 |
111 | Revalidation failed(再驗(yàn)證失?。?/td> | 代理再驗(yàn)證資源有效性時(shí)失?。ǚ?wù)器無法到達(dá)等原因) |
112 | Disconnection operation(斷開連接操作) | 代理與互聯(lián)網(wǎng)連接被故意切斷 |
113 | Heuristic expiration(試探性過期) | 響應(yīng)的使用其超過24小時(shí)(有效緩存的設(shè)定時(shí)間大于24小時(shí)的情況下) |
199 | Miscellaneous warning(雜項(xiàng)警告) | 任意的警告內(nèi)容 |
214 | Transformation applied(使用了轉(zhuǎn)換) | 代理對(duì)內(nèi)容編碼或媒體類型等執(zhí)行了某些處理時(shí) |
299 | Miscellaneous persistent warning(持久雜項(xiàng)警告) | 任意的警告內(nèi)容 |
#p#
首部字段Accept可以指定媒體類型以及優(yōu)先級(jí),如:Accept: text/html;q=0.9,text/css;q=0.3.
常見幾種媒體類型:
文件文本:
text/html,text/plain,text/css,application/xhtml+xml,application/xml…
圖片文件:
image/jpeg,image/gif,image/png…
視頻文件:
video/mpeg,video/quicktime…
應(yīng)用程序使用的二進(jìn)制文件:
application/octet-stream,application/zip…
若想要給Accept開頭的首部字段的參數(shù)增加優(yōu)先級(jí),可以使用q=來額外表示,用分號(hào)(;)進(jìn)行分隔,權(quán)重值q的范圍是0~1,默認(rèn)權(quán)重為1,權(quán)重越大就越優(yōu)先。
If-Match首部字段它會(huì)告知服務(wù)器匹配資源所用的實(shí)體標(biāo)記ETag值,只有兩者一致才會(huì)執(zhí)行請(qǐng)求,而ETag值會(huì)隨服務(wù)器資源更新而更新。
If-Modified-Since首部字段指定的日期時(shí)間之后,如果請(qǐng)求的資源有更新則接受請(qǐng)求,沒有則返回304狀態(tài)碼。
If-None-Match首部字段指定的標(biāo)記值若與請(qǐng)求資源的ETag值不一致時(shí),服務(wù)器就接受請(qǐng)求。
If-Range首部字段指定的值若是跟ETag值一致時(shí),那么就根據(jù)范圍返回請(qǐng)求資源,否則返回全體請(qǐng)求資源(這相當(dāng)于指定范圍無效)。
If-Unmodified-Since首部字段告知請(qǐng)求資源在其字段指定的值時(shí)間之后,為發(fā)生更新的情況下,才能處理請(qǐng)求。
Referer首部字段會(huì)告知服務(wù)器請(qǐng)求的原始資源的URI,其實(shí)就是從某個(gè)網(wǎng)站向服務(wù)器資源請(qǐng)求的URI,比如:你在百度URIwww.baidu.com點(diǎn)擊鏈接http://blog.csdn.net/xuguoli_beyondboy跳轉(zhuǎn)到這個(gè)頁面,那么Referer首部字段就是指定這個(gè)www.baidu.comURI。
Age首部字段告知客戶端,源服務(wù)器在多久前創(chuàng)建了響應(yīng),單位為秒,但若創(chuàng)建該響應(yīng)的服務(wù)器是緩存服務(wù)器,Age就是指緩存后的響應(yīng)再次發(fā)起認(rèn)證到認(rèn)證完成的時(shí)間值。
Retry-After首部字段會(huì)告知客戶端應(yīng)該在多久之后再次發(fā)送請(qǐng)求。
Vary首部字段:從代理服務(wù)器接收到源服務(wù)器返回包含Vary指定項(xiàng)的響應(yīng)之后,僅對(duì)請(qǐng)求中含有相同Vary指定首部字段的請(qǐng)求返回緩存,否則代理服務(wù)器需先從源服務(wù)器端獲取資源后才能作為響應(yīng)返回(即使對(duì)相同資源發(fā)起請(qǐng)求)。
首部字段WWW-Authenticate用于HTTP訪問認(rèn)證,它會(huì)告知客戶端適用于訪問請(qǐng)求URI所指定資源的認(rèn)證方案(Basic或Digest)和帶參數(shù)提示的質(zhì)詢。
Content-Loaction首部字段表示的是報(bào)文主體返回資源對(duì)應(yīng)的URI。
Content-MD5首部字段在于檢查報(bào)文主體在傳輸過程中是否保持完整,以及確認(rèn)傳輸?shù)竭_(dá),其過程如下:
服務(wù)器對(duì)報(bào)文主體執(zhí)行MD5算法獲得的128位二進(jìn)制數(shù),再通過Base64編碼后將結(jié)果寫入Content-MD5字段值,為確保報(bào)文的有效性,客戶端對(duì)報(bào)文主體再執(zhí)行一次相同的MD5算法,計(jì)算出的值與Content-MD5首部字段的值相比較,即可判斷出報(bào)文主體的準(zhǔn)確性。
Expires首部字段:如果請(qǐng)求還在Expires字段值指定的時(shí)間之前,則會(huì)返回緩存的該資源,當(dāng)超過其時(shí)間之后,發(fā)送來的請(qǐng)求將會(huì)轉(zhuǎn)向源服務(wù)器請(qǐng)求資源。
Cookie首部字段:
首部字段 | 說明 | 首部類型 |
---|---|---|
Set-Cookie | 開始狀態(tài)管理所使用的Cookie信息 | 響應(yīng)首部字段 |
Cookie | 服務(wù)器接收到的Cookie信息 | 請(qǐng)求首部字段 |
Set-Cookie字段屬性:
屬性 | 說明 |
---|---|
NAME=VALUE | 賦予Cookie的名稱和值(必需項(xiàng) ) |
expires=DATE | Cookie的有效期(若不明確指定則默認(rèn)為瀏覽器關(guān)閉前為止) |
path=PATH | 將服務(wù)器上的文件目錄為Cookie的使用對(duì)象(若不指定則默認(rèn)為文檔所在的文件目錄) |
domain=域名 | 作為Cookie使用對(duì)象的域名(若不指定則默認(rèn)為創(chuàng)建Cookie的服務(wù)器的域名) |
Secure | 僅在HTTPS安全通信時(shí)才會(huì)發(fā)送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript腳本訪問 |
X-Frame-Options首部字段用于控制網(wǎng)站內(nèi)容在其他Web網(wǎng)站的Frame標(biāo)簽內(nèi)的顯示問題,不過目的主要是為了防止點(diǎn)擊劫持攻擊,其兩個(gè)屬性:
DENT:拒絕
SAMEORIGN:僅同源域名下的頁面匹配時(shí)許可,比如:當(dāng)指定http:/hackr.jp/sample.html頁面為SAMEORIGN時(shí),那么hackr .jp上所有的頁面的frame都被許可加載該頁面,而example.com等其他域名的頁面就不行了。
X-XSS-Protection首部字段是針對(duì)跨站腳本攻擊的一種對(duì)策,用于控制瀏覽器XSS防護(hù)機(jī)制的開關(guān),屬性值如下:
0:將XSS過濾設(shè)置成無效狀態(tài)。
1:將XSS過濾設(shè)置成有效狀態(tài)。
DNT首部字段用來拒絕個(gè)人信息被收集,常表示拒絕被精準(zhǔn)廣告追蹤的一種方法,屬性值如下:
0:同意被追蹤
1:拒絕被追蹤
P3P首部字段可用來保護(hù)用戶隱私。