前言:這兩天在做Web Api的服務,需要進行認證,用到了請求頭里的Authorization,由於對請求頭不是很熟悉,所以找了相關資料查看,整理一下,以便日后查看。
一、Http頭域列表與解釋之Request篇
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規范中,這些HTTP頭是每個基於HTTP協議的軟件必須實現的,而其他一些更新和擴展的頭域也必須被基於HTTP的軟件實現。當然,各個軟件也可以定義自己的頭域。
另一方面,RFC2616規范中並沒有限制每個HTTP頭的長度,或者限制HTTP頭的數量,但出於性能和安全的考慮,多數服務器都會自己作規定,例如apache2.3 就規定每個HTTP頭不能超過8190個字節,每個請求不能超過100個HTTP頭。
以下來看看發送一個請求(request)時候,可能包含的各個HTTP頭和它的解釋。
1、標准的請求頭
-
Accept : 瀏覽器(或者其他基於HTTP的客戶端程序)可以接收的內容類型(Content-types),例如
Accept: text/plain
-
Accept-Charset:瀏覽器能識別的字符集,例如
Accept-Charset: utf-8
-
Accept-Encoding:瀏覽器可以處理的編碼方式,注意這里的編碼方式有別於字符集,這里的編碼方式通常指gzip,deflate等。例如
Accept-Encoding: gzip, deflate
-
Accept-Language:瀏覽器接收的語言,其實也就是用戶在什么語言地區,例如簡體中文的就是
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就是瀏覽器和服務器 的通信連接會被持續保存,不會馬上關閉,而close就會在response后馬上關閉。但這里要注意一點,我們說HTTP是無狀態的,跟這個是否keep-alive沒有關系,不要認為keep-alive是對HTTP無狀態的特性的改進。
-
Cookie:瀏覽器向服務器發送請求時發送cookie,或者服務器向瀏覽器附加cookie,就是將cookie附近在這里的。例如:
Cookie:user=admin
-
Content-Length:一個請求的請求體的內存長度,單位為字節(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:發送請求時的GMT時間。例如:
Date: Tue, 15 Nov 1994 08:12:31 GMT
-
Expect:指示需要使用服務器某些特殊的功能。(這個我不是很清楚)
-
From:發送這個請求的用戶的email地址。例如:
From: user@example.com
-
Host:被服務器的域名或IP地址,如果不是通用端口,還包含該端口號,例如:
Host: www.some.com:182
-
If-Match :通常用在使用PUT方法對服務器資源進行更新的請求中,意思就是,詢問服務器,現在正在請求的資源的tag和這個If-Match的tag相不相同,如果相同,則證明服務器上的這個資源還是舊的,現在可以被更新,如果不相同,則證明該資源被更新過,現在就不用再更新了(否則有可能覆蓋掉其他人所做的更改)。
-
If-Modified-Since:詢問服務器現在正在請求的資源在某個時間以來有沒有被修改過,如果沒有,服務器則返回304狀態來告訴瀏覽器使用瀏覽器自己本地的緩存,如果有修改過,則返回200,並發送新的資源(當然如果資源不存在,則返回404。)
-
If-None-Match:和If-Modified-Since用意差不多,不過不是根據時間來確定,而是根據一個叫ETag的東西來確定。關於etag我想在下一篇博客介紹一下。
-
If-Range:告訴服務器如果這個資源沒有更改過(根據If-Range后面給出的Etag判斷),就發送這個資源中在瀏覽器缺少了的某些部分給瀏覽器,如果該資源以及被修改過,則將整個資源重新發送一份給瀏覽器。
-
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:用來記錄一個請求經過了哪些代理或網關才被送到目標服務器上。例如一個請求從瀏覽器出發(假設使用http/1.0),發送給名為 SomeProxy的內部代理,然后被轉發至www.somenet.com的公共代理(使用http/1.1),最后被轉發至目標服務器www.someweb.com,那么在someweb.com中收到的via 頭應該是:
via:1.0 someProxy 1.1 www.someweb.com(apache 1.1)
-
Warning:記錄一些警告信息。
2、通用但非標准的HTTP頭(通常,非標准的頭域都是用“X-”開頭,例如”x-powered-by”)
-
X-Requested-With:主要是用來識別ajax請求,很多javascript框架會發送這個頭域(值為XMLHttpRequest)
-
DNT : DO NOT TRACK的縮寫,要求服務器程序不要跟蹤記錄用戶信息。DNT: 1 (開啟DNT) DNT: 0 (關閉DNT)火狐,safari,IE9都支持這個頭域,並且於2011年3月7日被提交至IETF組織實現標准化
-
X-Forwarded-For : 記錄一個請求從客戶端出發到目標服務器過程中經歷的代理,或者負載平衡設備的IP。
-
X-Forwarded-Proto:記錄一個請求一個請求最初從瀏覽器發出時候,是使用什么協議。因為有可能當一個請求最初和反向代理通信時,是使用https,但反向代理和服務器通信時改變成http協議,這個時候,X-Forwarded-Proto的值應該是https
-
Front-End-Https:微軟使用與其負載平衡的一個頭域。
【注:本文內容參考自:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields】