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






















