天天看点

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 的呈现引擎