6.1 HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供信息。
HTTP请求报文
在请求中,HTTP报文由 方法、URI、HTTP版本、HTTP首部字段 等部分构成:
HTTP响应报文
在响应中,HTTP报文由 HTTP版本、状态码(数字和原因短语)、HTTP首部字段 构成:
6.2 HTTP首部字段
HTTP首部字段是为了给浏览器和服务器提供 报文主体大小、使用的语言、认证信息等内容,所以HTTP首部字段内可以附加的信息较多。
HTTP首部字段结构
HTTP首部字段由首部字段名和字段值构成,中间用冒号分隔:
Content-Type: text/html
另外,字段值对应单个HTTP首部字段可以有多个值:
Keep-Alive: timeout = 15, max = 100
4种HTTP首部字段类型
HTTP首部字段根据实际用途被分为四种:
- 通用首部字段:请求报文和响应报文双方都会使用的首部。
- 请求首部字段:从客户端向服务器端发送请求报文时使用的首部。
- 响应首部字段:从服务器端向客户端返回响应报文时使用的首部。
- 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。
6.3 HTTP/1.1 通用首部字段
感觉有点鸡肋
6.4 请求首部字段
请求首部字段,用于补充 请求的附加信息、客户端信息、对相应内容相关的优先级 等内容。
Accept
Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
如果想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值,用分号;
进行分隔。权重值范围为0~1(可精确到小数点后3位)。不指定权重时,默认为q=1.0。
当服务器提供多种内容时,会首先返回权重值最高的媒体类型。
Accept-Charset
该首部字段用于通知服务器,用户代理支持的字符集及字符集的相对优先顺序。此外可以类似于Accept首部字段,指定多个字符集并设置权重值。
Accept-Encoding
该首部字段用于告知服务器,用户代理支持的内容编码即内容编码的优先级顺序。可指定多种内容编码。
Accept-Language
该首部字段用于告知服务器,用户代理能够处理的自然语言集(指中文、英文等),以及相对优先级。
Authorization
该字段用于告知服务器,用户代理的认证信息(证书值)。通常,想通过服务器认证的用户代理会在接收到返回的401 Unauthorization
状态码响应后,把首部字段Authorization
加入请求中。
Expect
客户端通过该字段告知服务器,期望出现某种特定行为。因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed
。
From
该首部字段用于告知服务器,使用用户代理的用户的电子邮件地址。
Host
该首部字段用于告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段。
Host首部字段用于以单台服务器分配多个域名的虚拟主机的工作机制。
请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。但是如果在相同IP地址下部署运行多个域名,那么服务器就无法理解究竟是客户端是在请求哪个域名。因此使用Host字段来明确指出请求的主机名。
If-Match
形如If-xxx
之类的请求首部字段,都可称为条件请求。服务器在接收到附带条件的请求后,只有判断指定条件为真这时才会执行请求。
该首部字段属于附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。这时的服务器无法使用弱ETag值。
服务器会比对If-Match字段值和资源的ETag值,仅当两者一致时才会执行请求。反之返回状态码412 Precondition Failed
的响应。
还可以使用星号(*)指定If-Match字段值,此时服务器将会忽略ETag值,只要资源存在就处理请求。
If-Modified-Since
该首部字段属于附带条件之一,它会告知服务器如果If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。而在指定If-Modified-Since字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码4304 Not Modified
的响应。
该首部字段用于确认代理或客户端拥有的本地资源的有效性。
If-None_match
在GET或HEAD方法中使用该字段可获取最新的资源。
If-Range
该首部字段用于告知服务器若指定的If-Range字段值和请求资源的ETag相一致时,则作为范围请求处理;反之,返回全体资源。
If-Unmodified-Since
和首部字段If-Modified-Since作用相反。
Max-Forwards
通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forward的请求时,该字段指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,该字段值减1并重新赋值。当服务器接收到Max-Forward值为0的请求时,则不再进行转发,而是直接返回响应。
使用HTTP协议通信时,请求可能会经过代理等多台服务器。途中如果某个代理服务器转发请求失败,客户端也就等不到服务器返回的响应了。所以可以使用Max-Forward首部字段,针对上述问题产生原因展开调查。
Proxy-Authorization
接收到代理服务器发来的认证质询时,客户端会发送包含该首部字段的请求,以告知服务器认证所需要的信息。
Range
包含该首部字段即可告知服务器资源指定范围,满足只要获取部分资源的范围请求。
接收到该首部字段请求的服务器,会在处理请求后返回状态码206 Partial Content
的响应。无法处理该范围请求时,则会返回状态码200 OK
的响应和全部资源。
Referer
该首部字段会告知服务器请求的原始资源的URI。
客户端一般都会发送该字段给服务器。但是当直接在浏览器的地址栏输入URI,或处于安全性考虑时,也可以不发送该首部字段。
TE
该首部字段会告知服务器,客户端能够处理响应的传输编码方式及相对优先级。
User-Agent
用于传递服务器的种类:
该字段会将创建请求的浏览器和用户代理名称等信息传达给服务器。
当网络爬虫发起请求时,有可能在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,也有可能在中间添加代理服务器的名称。
6.5 响应首部字段
Accept-Ranges
该首部字段告知客户端,服务器是否能够处理范围请求,以指定获取服务器端某个部分的资源。
可指定的字段值有两种,可处理范围请求时指定为bytes,反之为none。
Age
该首部字段告知客户端,源服务器在多久之前创建了响应。字段值单位为秒。
若创建该响应的服务器是缓存服务器,Age的值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上该首部字段。
ETag
该首部字段能告知客户端实体标识。它是一种可将资源以字符串形式做唯一标识的方式。服务器会为每份资源分配对应的ETag值。
另外,当资源更新时,也需要更新ETag。
强ETag和弱ETag值:
- 强ETag值:无论实体发生多么细微的变化都会改变其值
- 弱ETag值:只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变Etag值。通过在字段值最开始处附加
W/
Location
使用该首部字段可以将响应接收方引导至某个与请求URI位置不同的资源。
基本上该字段都会配合状态码3xx:Redirection
的响应,提供重定向的URI。
几乎所有浏览器都会在接收到包含该首部字段的响应后,强制性尝试对已提示的重定向资源的访问。
Proxy-Authenticate
该首部字段会把由代理服务器所要求的认证信息发送给客户端。
它的认证行为是在客户端与代理之间的,而首部字段WWW-Authorization
的认证行为是在客户端与服务器之间的
Retry-After
该首部字段告知客户端应该在多久之后再次发送请求。主要配合状态码503 Service Unavailable
响应或3xx Redirect
响应一起使用。
字段值可以指定为具体日期(Wed, 04 Jul 2012 06:34:24 GMT 等格式),也可以是创建响应后的秒数。
Server
该首部字段告知客户端,当前服务器上安装的HTTP服务器应用程序的信息。不仅会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。
Vary
该首部字段可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。
从代理服务器接收到源服务器返回包含Vary
指定项的响应后,若再要进行缓存,仅对请求中含有相同Vary
指定首部字段的请求返回缓存。即使对相同资源发起请求,但由于Vary
指定的首部字段不相同,因此必须从源服务器重新获取资源。
WWW-Authenticate
该首部字段用于HTTP访问认证。会告知客户端适用于请求URI所指定资源的认证方案(Basic或是Digest)和带参数提示的质询(challenge)。状态码401 Unauthorized
响应中,肯定带有该首部字段。
6.6 实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部。
Allow
该首部字段用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。
当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed
响应返回,同时还会把所有支持的HTTP方法写入首部字段Allow后返回。
Content-Encoding
该首部字段告知客户端,服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
主要有以下四种:
- gzip
- compress
- deflate
- identity
Content-Language
告知客户端,实体主体使用的自然语言(指中文或英文等)
Content-Length
表明实体主体部分的大小(单位是字节)。对实体主体进行内容编码(压缩)传输时,不能再使用该首部字段。
Content-Location
给出与报文主体部分相对应的URI。和首部字段Location不同,该首部字段表示的是报文主体返回资源对应的URI。
Content-MD5
该首部字段是一串由MD5算法生成的值,目的是检查报文主体在传输过程中是否保持完整,以及确认传输到达。
对报文主体执行MD5算法得到128位二进制数,再通过Base64编码后将结果写入该首部字段(因为HTTP首部无法记录二进制值,所以要通过Base64编码处理)。为确保报文有效性,作为接收方的客户端会对报文主体再执行一次相同的MD5算法,计算出的值与字段值比较后,即可判断报文主体的准确性。
Content-Range
该首部字段是针对范围请求的响应返回,能够告知客户端作为响应返回的实体的哪个部分符合范围请求。
Content-Type
该首部字段表明实体主体内对象的媒体类型。
Expires
将资源实效的日期告知客户端。缓存服务器在接收到含有该首部字段的响应后,会以缓存来应答请求,在该字段值指定的时间之前,响应用的副本会一直保存;当超过指定时间后,缓存服务器在接收到请求时,会转向源服务器请求资源。
Last-Modified
该首部字段指明资源最终修改时间。
6.7 为Cookie服务的首部字段
Cookie工作机制是用户识别和状态管理。Web网站为了管理用户的状态,会通过Web浏览器,把一些数据临时写入用户的计算机内。等到用户访问该Web网站时,可通过通信方式取回之前发放的Cookie。
为Cookie服务的首部字段:
- Set-Cookie:开始状态管理所使用的Cookie信息,是响应首部字段。
- Cookie:服务器接收到的Cookie信息,是请求首部字段。
Set-Cookie
当服务器准备开始管理客户端状态时,会事先告知各种信息。
一些字段值:
Cookie
该首部字段会告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie