HTTP 頭域是HTTP協議中請求(request)和響應(response)中的頭部信息,其實就是HTTP通信的操作參數养涮,告訴web服務器和瀏覽器怎樣處理這個通信后频。HTTP頭從一個請求信息或者響應信息的第二行開始(第一行是請求行或者響應行),以兩個CR-LF字符組結束(CR:回車符,\r唐责,LF:換行符\n)而每個HTTP頭是字符串形式的鳞溉,用冒號分割的鍵值對,多個HTTP頭之間用CR-LF字符組隔開鼠哥。
某些http頭可以有注釋熟菲,例如user-agent,server,via。但這些注釋會被服務器或者瀏覽器忽略IETF組織已經將一些核心的HTTP頭定義在RFC2616規(guī)范中朴恳,這些HTTP頭是每個基于HTTP協議的軟件必須實現的抄罕,而其他一些更新和擴展的頭域也必須被基于HTTP的軟件實現。當然于颖,各個軟件也可以定義自己的頭域呆贿。
另一方面,RFC2616規(guī)范中并沒有限制每個HTTP頭的長度森渐,或者限制HTTP頭的數量做入,但出于性能和安全的考慮,多數服務器都會自己作規(guī)定章母,例如apache2.3 就規(guī)定每個HTTP頭不能超過8190個字節(jié)母蛛,每個請求不能超過100個HTTP頭。
以下來看看發(fā)送一個請求(request)時候乳怎,可能包含的各個HTTP頭和它的解釋彩郊。
標準的請求頭:
Accept:瀏覽器(或者其他基于HTTP的客戶端程序)可以接收的內容類型(Content-types),例如 Accept: text/plain
Accept-Charset:瀏覽器能識別的字符集,例如 Accept-Charset: utf-8
Accept-Encoding:瀏覽器可以處理的編碼方式蚪缀,注意這里的編碼方式有別于字符集秫逝,這里的編碼方式通常指gzip,deflate等。例如 Accept-Encoding: gzip, deflate
Accept-Language:瀏覽器接收的語言询枚,其實也就是用戶在什么語言地區(qū)违帆,例如簡體中文的就是 Accept-Language: zh-CN
Accept-Datetime:(這個暫時沒搞清楚什么意思)
Authorization:在HTTP中,服務器可以對一些資源進行認證保護金蜀,如果你要訪問這些資源刷后,就要提供用戶名和密碼的畴,這個用戶名和密碼就是在Authorization頭中附帶的,格式是“username:password”字符串的base64編碼尝胆,例如:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==中丧裁,basic指使用basic認證方式, QWxhZGRpbjpvcGVuIHNlc2FtZQ==使用base64解碼就是“Aladdin:open sesame”
Cache-Control:這個指令在request和response中都有含衔,用來指示緩存系統(服務器上的煎娇,或者瀏覽器上的)應該怎樣處理緩存,因為這個頭域比較重要贪染,特別是希望使用緩 存改善性能的時候缓呛,內容也較多,所以我想在下一篇博文中主要介紹一下杭隙。
Connection:告訴服務器這個user agent(通常就是瀏覽器)想要使用怎樣的連接方式哟绊。值有keep-alive和close。http1.1默認是keep-alive寺渗。keep-alive就是瀏覽器和服務器 的通信連接會被持續(xù)保存匿情,不會馬上關閉兰迫,而close就會在response后馬上關閉信殊。但這里要注意一點,我們說HTTP是無狀態(tài)的汁果,跟這個是否keep-alive沒有關系涡拘,不要認為keep-alive是對HTTP無狀態(tài)的特性的改進。
Cookie:瀏覽器向服務器發(fā)送請求時發(fā)送cookie据德,或者服務器向瀏覽器附加cookie鳄乏,就是將cookie附近在這里的。例如:Cookie:user=admin
Content-Length:一個請求的請求體的內存長度棘利,單位為字節(jié)(byte)橱野。請求體是指在HTTP頭結束后,兩個CR-LF字符組之后的內容善玫,常見的有POST提交的表單數據水援,這個Content-Length并不包含請求行和HTTP頭的數據長度。
Content-MD5:使用base64進行了編碼的請求體的MD5校驗和茅郎。例如:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Type:請求體中的內容的mime類型蜗元。通常只會用在POST和PUT方法的請求中。例如:Content-Type: application/x-www-form-urlencoded
Date:發(fā)送請求時的GMT時間系冗。例如:Date: Tue, 15 Nov 1994 08:12:31 GMT
Expect:指示需要使用服務器某些特殊的功能奕扣。(這個我不是很清楚)
From:發(fā)送這個請求的用戶的email地址。例如:From: user@example.com
Host:被服務器的域名或IP地址掌敬,如果不是通用端口惯豆,還包含該端口號池磁,例如:Host: www.some.com:182
If-Match:通常用在使用PUT方法對服務器資源進行更新的請求中,意思就是楷兽,詢問服務器框仔,現在正在請求的資源的tag和這個If-Match的tag相不相同,如果相同拄养,則證明服務器上的這個資源還是舊的离斩,現在可以被更新,如果不相同瘪匿,則證明該資源被更新過跛梗,現在就不用再更新了(否則有可能覆蓋掉其他人所做的更改)。
If-Modified-Since:詢問服務器現在正在請求的資源在某個時間以來有沒有被修改過棋弥,如果沒有核偿,服務器則返回304狀態(tài)來告訴瀏覽器使用瀏覽器自己本地的緩存,如果有修改過顽染,則返回200漾岳,并發(fā)送新的資源(當然如果資源不存在,則返回404粉寞。)
If-None-Match:和If-Modified-Since用意差不多尼荆,不過不是根據時間來確定,而是根據一個叫ETag的東西來確定唧垦。關于etag我想在下一篇博客介紹一下捅儒。
If-Range:告訴服務器如果這個資源沒有更改過(根據If-Range后面給出的Etag判斷),就發(fā)送這個資源中在瀏覽器缺少了的某些部分給瀏覽器振亮,如果該資源以及被修改過巧还,則將整個資源重新發(fā)送一份給瀏覽器。
If-Unmodified-Since:詢問服務器現在正在請求的資源在某個時刻以來是否沒有被修改過坊秸。
Max-Forwards:限制請求信息在代理服務器或網關中向前傳遞的次數麸祷。
Pragma:好像只有一個值,就是:no-cache褒搔。Pragma:no-cache 與cache-control:no-cache相同阶牍,只不過cache-control:no-cache是http1.1專門指定的,而Pragma:no-cache可以在http1.0和1.1中使用
Proxy-Authorization:連接到某個代理時使用的身份認證信息站超,跟Authorization頭差不多荸恕。例如:Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range:在HTTP頭中,"Range"字眼都表示“資源的byte形式數據的順序排列死相,并且取其某一段數據”的意思钞翔。Range頭就是表示請求資源的從某個數值到某個數值間的數據宫盔,例如:Range: bytes=500-999 就是表示請求資源從500到999byte的數據吴旋。數據的分段下載和多線程下載就是利用這個實現的璧榄。
Referer:指當前請求的URL是在什么地址引用的。例如在www.a.com/index.html頁面中點擊一個指向www.b.com的超鏈接,那么,這個www.b.com的請求中的Referer就是www.a.com/index.html。通常我們見到的圖片防盜鏈就是用這個實現的倒彰。
Upgrade:請求服務器更新至另外一個協議,例如:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent:通常就是用戶的瀏覽器相關信息莱睁。例如:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0
Via:用來記錄一個請求經過了哪些代理或網關才被送到目標服務器上待讳。例如一個請求從瀏覽器出發(fā)(假設使用http/1.0),發(fā)送給名為 SomeProxy的內部代理仰剿,然后被轉發(fā)至www.somenet.com的公共代理(使用http/1.1)创淡,最后被轉發(fā)至目標服務器www.someweb.com,那么在someweb.com中收到的via 頭應該是:via:1.0 someProxy 1.1 www.someweb.com(apache 1.1)
Warning:記錄一些警告信息南吮。
通用但非標準的HTTP頭(通常琳彩,非標準的頭域都是用“X-”開頭,例如"x-powered-by"):
X-Requested-With:主要是用來識別ajax請求部凑,很多javascript框架會發(fā)送這個頭域(值為XMLHttpRequest)
DNT:DO NOT TRACK的縮寫露乏,要求服務器程序不要跟蹤記錄用戶信息。DNT: 1 (開啟DNT) DNT: 0 (關閉DNT)火狐涂邀,safari,IE9都支持這個頭域瘟仿,并且于2011年3月7日被提交至IETF組織實現標準化
X-Forwarded-For:記錄一個請求從客戶端出發(fā)到目標服務器過程中經歷的代理,或者負載平衡設備的IP必孤。
X-Forwarded-Proto:記錄一個請求一個請求最初從瀏覽器發(fā)出時候猾骡,是使用什么協議。因為有可能當一個請求最初和反向代理通信時敷搪,是使用https,但反向代理和服務器通信時改變成http協議幢哨,這個時候赡勘,X-Forwarded-Proto的值應該是https
Front-End-Https:微軟使用與其負載平衡的一個頭域。
X-ATT-DeviceId:AT&A的產品中使用的頭域捞镰,不過不是很清楚用途闸与。