HTTP

HTTP 知识量:10 - 42 - 186

6.4 请求首部字段><

Accept- 6.4.1 -

Accept首部字段可通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

媒体类型主要有:

  • 文本文件。例如:text/html, text/plain, text/css ...

  • 图片文件。例如:image/jpeg, image/gif, image/png ...

  • 视频文件。例如:video/mpeg, video/quicktime ...

  • 应用程序使用的二进制文件。例如:application/octet-stream, application/zip ...

若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号(;)进行分隔。权重值q的范围是0~1(可精确到小数点后3位),且1为最大值。不指定权重q值时,默认权重为q=1.0。当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。

Accept-Charset- 6.4.2 -

Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。

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

Accept-Encoding- 6.4.3 -

Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。

Accept-Encoding: gzip, deflate

内容编码主要有:

  • gzip。由文件压缩程序gzip(GNU zip)生成的编码格式(RFC1952),采用Lempel-Ziv算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称CRC)。

  • compress。由UNIX文件压缩程序compress生成的编码格式,采用Lempel-Ziv-Welch算法(LZW)。

  • deflate。组合使用zlib格式(RFC1950)及由deflate压缩算法(RFC1951)生成的编码格式。

  • identity。不执行压缩或不会变化的默认编码格式。

Accept-Encoding首部字段采用权重q值来表示相对优先级,这点与首部字段Accept相同。另外,也可使用星号(*)作为通配符,指定任意的编码格式。

Accept-Language- 6.4.4 -

首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

和Accept首部字段一样,按权重值q来表示相对优先级。在以上示例中,客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版时,则请求返回英文版响应。

Authorization- 6.4.5 -

首部字段Authorization是用来告知服务器用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。共用缓存在接收到含有Authorization首部字段的请求时的操作处理会略有差异。

Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

Expect- 6.4.6 -

客户端使用首部字段Expect来告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望而发生错误时,会返回状态码417 Expectation Failed。

Expect: 100-continue

客户端可以利用该首部字段,写明所期望的扩展。虽然HTTP/1.1规范只定义了100-continue(状态码100 Continue之意)。

From- 6.4.7 -

首部字段From用来告知服务器使用用户代理的用户的电子邮件地址。通常,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。

使用代理时,应尽可能包含From首部字段(但可能会因代理不同,将电子邮件地址记录在User-Agent首部字段内)。

Host- 6.4.8 -

首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段。

Host: www.pnotes.cn

首部字段Host和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,这是首部字段Host必须存在的意义。

请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。但如果这时,相同的IP地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此,就需要使用首部字段Host来明确指出请求的主机名。若服务器未设定主机名,那直接发送一个空值即可。

If-Match- 6.4.9 -

形如If-xxx这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match: "123456"

首部字段If-Match属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。这时的服务器无法使用弱ETag值。

服务器会比对If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求。反之,则返回状态码412 Precondition Failed的响应。

还可以使用星号(*)指定If-Match的字段值。针对这种情况,服务器将会忽略ETag的值,只要资源存在就处理请求。

If-Modified-Since- 6.4.10 -

首部字段If-Modified-Since属附带条件之一,它会告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。而在指定If-Modified-Since字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码304Not Modified的响应。

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

If-Modified-Since用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段Last-Modified来确定。

If-None-Match- 6.4.11 -

首部字段If-None-Match属于附带条件之一。它和首部字段If-Match作用相反。用于指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,它就告知服务器处理该请求。

在GET或HEAD方法中使用首部字段If-None-Match可获取最新的资源。因此,这与使用首部字段If-Modified-Since时有些类似。

If-Range- 6.4.12 -

首部字段If-Range属于附带条件之一。它告知服务器若指定的If-Range字段值(ETag值或者时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

If-Unmodified-Since- 6.4.13 -

首部字段If-Unmodified-Since和首部字段If-Modified-Since的作用相反。它的作用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回。

If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT

Max-Forwards- 6.4.14 -

通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,会将Max-Forwards的值减1后重新赋值。当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应。

Max-Forwards: 10

使用HTTP协议通信时,请求可能会经过代理等多台服务器。途中,如果代理服务器由于某些原因导致请求转发失败,客户端也就等不到服务器返回的响应了。

可以灵活使用首部字段Max-Forwards,针对以上问题产生的原因展开调查。由于当Max-Forwards字段值为0时,服务器就会立即返回响应,由此我们至少可以对以那台服务器为终点的传输路径的通信状况有所把握。

Proxy-Authorization- 6.4.15 -

接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。

Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

这个行为是与客户端和服务器之间的HTTP访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。客户端与服务器之间的认证,使用首部字段Authorization可起到相同作用。

Range- 6.4.16 -

对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。下面的示例表示请求获取从第5001字节至第10000字节的资源。

Range: bytes=5001-10000

接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206Partial Content的响应。无法处理该范围请求时,则会返回状态码200 OK的响应及全部资源。

Referer- 6.4.17 -

首部字段Referer会告知服务器请求的原始资源的URI。

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

客户端一般都会发送Referer首部字段给服务器。但当直接在浏览器的地址栏输入URI,或出于安全性的考虑时,也可以不发送该首部字段。因为原始资源的URI中的查询字符串可能含有ID和密码等保密信息,要是写进Referer转发给其他服务器,则有可能导致保密信息的泄露。

TE- 6.4.18 -

首部字段TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段Accept-Encoding的功能很相像,但是用于传输编码。

TE: gzip, deflate;q=0.5

首部字段TE除指定传输编码之外,还可以指定伴随trailer字段的分块传输编码的方式。应用后者时,只需把trailers赋值给该字段值:

TE: trailers

User-Agent- 6.4.19 -

首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。

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

由网络爬虫发起请求时,有可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称。