天天看點

6.3 請求首部字段

請求首部字段是從用戶端向伺服器發送請求封包中所使用的字段,用于補充請求的附加資訊,用戶端資訊,對響應内容相關的優先級等内容。

一,Accept

           Accept首部字段可通知伺服器,使用者能夠處理的媒體類型及媒體類型的相對優先級。

舉例:

         Accept:image/jpeg,image/gif;q=0.3,image/png

(1)上例說明用戶端支援的圖檔類型為jpeg,gif和png。

(2)q表明優先級,分号“;”把類型與優先級分隔,q取值為0~1,1的優先級最大。預設優先級為1.0。

(3)如果浏覽器不支援png類型就可以不指定png。

(4)當伺服器提供多種内容時,将會首先傳回權重值最高的媒體類型。

二,Accept-Charset

        Accept-Charset首部字段可用來通知伺服器使用者支援的字元集及字元集的相對優先順序。

舉例:

        Accept-Charset:iso-8859-5, unicode-1-1;q=0.8

(1)上例說明使用者支援的字元集為iso-8859-5和unicode-1-1;也就是說用戶端想用這兩個字元集閱讀傳回的頁面。

(2)q的用法和Accept首部字段相同。

三,Accept-Encoding

        Accept-Encoding首部字段用來告知伺服器使用者支援的内容編碼及内容編碼的優先級順序。

舉例:

        Accept-Encoding:gzip,deflate

(1)上例表明用戶端支援的内容編碼方式為gzip和deflate,也就是說,當伺服器端用這兩種編碼方式壓縮實體主體的時候,用戶端有能力解碼。

(2)當首部字段包含多種編碼方式時,可用q的方法來指定優先級。

(3)Accept-Encoding:*   表示用戶端支援任意方式的編碼。

四,Accept-Languag

         該首部字段用來告知伺服器用戶端支援的自然語言集(中文或英文)及自然語言集的相對優先級。

舉例:

         Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3(zh-cn,zh代表中文,en-us,en代表英文)

(1)上例表示用戶端支援中文和英文。

(2)中文的優先級高于英文,就是說伺服器有中文資源的時候,用戶端會請求其傳回中文資源;沒有用戶端請求傳回英文版資源。

五,Authorization

         該首部字段用來告知伺服器用戶端的認證資訊(證書值)。

舉例:

         請求:

                  GET  /index.htm

         響應:

                   401 UnAuthorized

                   www-Authenticate: Basic...

         請求:

                    GET /index.htm

                    Authorization:Basic dWVub3NLbjpwYXNzd29yZA==

         響應:

                    200 OK

(1)上例用戶端向伺服器請求/index.htm資源

(2)而伺服器端該頁面要求HTTP認證,于是發送響應要求用戶端發送認證資訊

(3)用戶端再接收到響應時用首部字段Authorization發送認證資訊

(4)伺服器在接收到認證資訊并确認後傳回資源

六,Expect

            該首部字段用來告知伺服器,期望出現的某種特定行為。

舉例:

          Expect:100-continue

(1)100 Continue是一狀态碼,表示伺服器允許用戶端繼續發送請求。

(2)如:發送一個請求包含  Expect:100-continue,詢問伺服器是否願意接受資料。如果伺服器傳回100 Continue狀态碼,才把資料POST給伺服器。

七,From

           該首部字段用來告知伺服器搜尋引擎等使用者代理的負責人的電子郵件位址。

舉例:

           From:[email protected]

八,Host

            該首部字段用來告知伺服器請求的資源所處的網際網路主機名和端口号。

舉例:

         Host:www.hackr.jp

(1)使用虛拟主機的伺服器,一個IP位址對應多台虛拟伺服器,我們就需要Host首部來指定我們需要請求資源的那台主機。

(2)這個首部字段是唯一一個必須被包含在請求内的首部字段。

(3)若伺服器未設定主機名,直接發送一個空值即可:Host:

九,If-xxx

      伺服器接受到這種形式的請求時,隻有判斷條件為真時,才會執行請求。

1.If-Match

            伺服器會比對If-Match的字段值和資源的ETag值,僅當兩者一緻時,才會執行請求。反之則傳回狀态碼412 Precondition Failed的響應。

舉例:

           請求:

                     GET  /index.html

                     If-Match:"123456"

             (1)伺服器端實體資源的ETag值為123456

                     200 OK

             (2)伺服器端實體資源的ETag值不為123456

                     412 Precondition Failed

*還可以使用星号*指定If-Match的字段值,此時伺服器将會忽略ETag的值,隻要資源存在就處理請求。

2. If-Modified-Since

            該首部字段會告知伺服器,如果伺服器端資源在字段值指定的日期之後有更新過,則希望能處理請求;如果在指定的日期後沒有跟新過,則會傳回304 Not Modified

舉例:

               請求:

                        GET /index.htm

                         If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT

                響應:

                (1)如果index.htm在2004年4月15日之後更新過

                         200 OK

                         Last-Modified:Sun, 29 Aug 2004 14:03:05 GMT(表示該資源在2004年8月29日有過更新)

                (2)如果在2004年4月15日之後沒有更新過

                            304 Not Modified

3.If-None-Match

               該首部字段與If-Match首部字段作用相反,隻有在字段值與伺服器端資源ETag值不一緻時伺服器才會響應請求。

(1) 伺服器資源都會有一個ETag值,當資源更新時,其ETag值也會随之改變。是以我們可以在GET或HEAD方法中加上If-None-Match首部字段來擷取最新資源。

4.If-Range

                   如果If-Range的字段值與伺服器端資源的ETag值一緻,則會傳回Range字段指定的範圍資源,否則傳回全部資源。

舉例:

                請求:

                          GET  /index.html

                          If-Range: "123456"

                          Range:bytes=5001-10000

                響應:

                       (1)/index.html的Etag值為123456(傳回範圍資源)

                                  206 Partial Content

                                  Content-Range: bytes 5001-10000/10000

                                  Content-Length: 5000

                        (2)ETag值為567890(傳回全部資源)

                                   200 OK

                                   ETag:"567890"

我們用If-Match代替If-Range來看

                 請求:

                          GET  /index.html

                          If-Match: "123456"

                          Range:bytes=5001-10000

                 響應:

                         (1)如果/index.html的ETag值為123456

                                  與If-Range的效果相同。

                          (2)重點!如果ETag值不為123456的話

                                     412 Precondition Failed

                                     這時候伺服器并不會像對待If-Range字段那樣傳回全部資源并傳回新的ETag值。是以用戶端還需要再發送一次請求

                                                 GET /index.html

                                       伺服器端才會傳回全部資源和新的ETag值。這樣就會花費兩倍的功夫。

5.If-Unmodified-Since

               該首部字段的作用與If-Modified-Since作用相反;如果請求的資源在字段值日期之後沒有過更新的話,則會響應請求,否則不會響應請求并傳回狀态碼 412 Precondition Failed。

十,Max-Forwards

         該首部字段配合TRACE方法或OPTIONS方法使用 ,發送請求封包時會給該首部字段指定一個值,每經過一個代理該值減1,減到0時代理不再往下轉發請求,并傳回響應。

舉例:

           請求:

                   Max-Forwards:2(該請求在到達第二台代理時會傳回響應)

(1)使用HTTP協定通信時會經過多台代理,如果某台代理由于某些原因導緻請求轉發失敗,用戶端就接收不到伺服器傳回的響應了,對此我們無從所知。

(2) 使用該首部字段再加上Via首部字段的資訊可以幫助我們确定問題出現在哪裡,因為我們至少可以對那台伺服器為終點的傳輸路徑的通信狀況有所把握。

十一,Proxy-Authorization

                   該首部字段的作用類似于Authorization首部字段,不同之處在于Proxy-Authorization的作用對象在用戶端與代理之間,而Authorization的作用對象在用戶端與伺服器之間。

十二,Range

             該首部字段的作用是告知伺服器用戶端需要部分資源。

舉例:

            請求:

                   Range:bytes=5001-10000

             響應:

                   206 Partial Content

如果伺服器無法處理該範圍請求則會傳回200 OK 及全部資源

十三,Referer

            當浏覽器向web伺服器發送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器基此可以獲得一些資訊用于處理。比如從我首頁上連結到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我首頁上的連結通路他的網站。

舉例:

          Referer: http://www.hackr.jp/index.htm

(1)當我在http://www.hackr.jp/index.htm頁面點選連結時,浏覽器便會向Web伺服器發送請求封包

(2)發送的請求封包中包含Referer字段,字段值為http://www.hackr.jp/index.htm,由此伺服器便可知道請求是從http://www.hackr.jp/index.htm頁面發起的。

(3)當字段值中包含使用者名和密碼等敏感資訊時,也可以不發送Referer字段。

十四,TE

             該首部字段會告知伺服器用戶端能夠處理響應的傳輸編碼方式及相對優先級。

舉例:

            TE:gzip,deflate;q=0.5

(1)首先該首部字段為逐跳首部,是以隻能單次轉發,也就是說隻能轉發到第一個代理伺服器。

(2)當該代理伺服器傳回響應的時候,用gzip編碼方式對實體主體進行編碼,用戶端接受到響應時進行解碼得到所需資源。

(3)如果該代理不支援gzip編碼方式則采用deflate編碼方式進行傳輸。

(注:該首部字段的解釋出于我本人的了解,可能不太準确)

十五,User-Agent

                該首部字段會建立請求的浏覽器和使用者代理名稱等資訊傳達給伺服器。使得伺服器能夠識别客戶使用的作業系統及版本、CPU 類型、浏覽器及版本、浏覽器渲染引擎、浏覽器語言、浏覽器插件等。

舉例:

             User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1

(1)Mozilla是基金會名稱,Firefox是火狐浏覽器,簡單說是公司和公司研發的産品的差別

(2)Windows NT 6.1是作業系統标志,對應作業系統windows 7

(3)WOW64 (Windows-on-Windows 64-bit)是一個Windows作業系統的子系統。

(4)Gecko 是 Firefox 的呈現引擎