报文分为请求报文与响应报文,除开报文实体的差异之外,两者的报文首部内容上也不尽相同。下图是访问www.baidu.com的报文首部截图:
可见,请求报文首部第一行是由“请求方法+协议及其版本”组成的请求行,响应报文首部的第一行则是“状态码+协议及其版本组成的”状态行。此外,包含各种首部字段的HTTP首部字段行也是有差别的,一般将HTTP首部字段语句分为:通用首部字段、请求首部字段、响应首部字段、实体首部字段。所有的字段格式都是“key:value”这种形式,如果value值有多个,中间用逗号隔开。接下来,来具体介绍首部字段的各种属性值:
通用首部字段
即,响应报文和请求报文中均可以存在的首部字段,具体包括:
1.Cache-Control
:
用以操纵缓存的工作机制,虽为通用首部字段,但其参数指令在请求报文首部与响应报文首部略有不同:
-
pubulic/private
:这是两个只存在于响应报文之中的功能相反的指令,pubulic代表可向任意方提供缓存,而private只能向特定用户提供缓存。 -
no-cache
:防止从缓存中获取过期资源。
若请求中包含该指令:则表示客户端不会接收缓存过的响应,缓存服务器会将请求直接转发给源服务器;
若响应中包含该指令:缓存服务器则不能对资源进行缓存,且源服务器将不再对缓存服务器中提出的请求进行有效性确认,禁止其进行缓存操作。 -
no-store
:暗示请求或响应中包含机密内容,禁止缓存。实际上该指令比no-cache
更加强硬,是真正的禁止缓存。 -
no-transform
:规定缓存不能改变实体主体的媒体类型。 -
max-age
:形如Cache-Control:max-age:60000
,其中的数字单位为秒。
若请求中包含该指令:表示缓存的时间若比该时间小,则加载缓存。故当max-age的值为0时,缓存服务器会直接将请求转发给源服务器。
若响应中包含该指令:缓存服务器将不再对资源的有效性进行确认,以max-age的数值来代表资源保存的最长缓存时间,其优先级是高于Expires的; -
min-fresh
:形如Cache-Control:min-fresh:60000
,其中的数字单位为秒。表示过了XX秒后的资源都无法作为缓存返回。 -
max-stale
:形如Cache -Control:max-stale:60000
,其中的数字单位为秒。表示只要处于max-stale的时间范围内,无论缓存是否过期都会照常接收。若无值,则表示无限期接收缓存。
PS:min-fresh
与max-stale
构成了非常规处理缓存的上下限。 -
must-revalidate
:代理会向源服务器再次验证即将返回的响应缓存是否有效,这是最高优先级的指令,会自动忽略max-stale
。
2.Conection
:
两个作用,其一是控制不再转发的首部字段名;其二是管理持久连接。
-
控制不再转发的首部字段名
如图所示,Connection:upgrade
控制了名为Upgrade的首部字段,只让代理服务其接收该字段,代理转发过程中删除了有关Upgrade的语句。 管理持久连接
共有两个参数:close
/keep-alive
,前者表示断开连接,后者表示保持持久连接。
3.Data
:
表示该HTTP报文所创立的日期与时间。
4.Trailer
:
事先说明在报文主体后记录了哪些首部字段。
5.Transfer-Encodding
:
规定了传输报文主体时采用何种编码形式。
6.Upgrade
:
用以检测HTTP协议及其它协议是否可使用更高版本进行通信,其参数可以指定一个完全不同的通信协议,如:Upgrade: TSL/1.0,HTTP/1.1
。
7.Via
:
用于记录经过代理服务器的转发情况,常与Trace
方法一块使用。
8.Warning
:
警告!
请求报文首部字段
请求报文首部字段意为只有请求报文特有的,只会出现在请求报文中的首部字段。用于补充请求的附加信息,客户端信息 以及对响应内容的优先级等等。
1.Accept
:
Accept字段可以告知服务器,用户代理能够处理的媒体类型及其优先级,可用type/subtype的这种形式来一次指定多个媒体类型,如:
- 文本文件
text/html
,text/js
,text/css
application/xhtml+xml,application/xml
- 图片文件
image/gif
,image/jpeg
,image/png
- 视频文件
video/mpeg
,video/quicktime
- 二进制文件
application/octec-stream
,application/zip
若想要给显示的媒体类型添加优先级,则使用 q=(0~1)来表示权重值,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
2.Accept-Charset/Accept-Encoding/Accept-Language
:
这三个分别表示通知服务器用户代理所能支持的字符集/编码类型/以及支持的语言。同样的他们也能用q=(0~1)来表示优先级。
3.Authorization
:
告知服务器,用户代理的认证登录信息,是服务器返回401状态码用户登录后,给请求添加的登录信息,现在基本上不会使用这种方法。
4.From
:
来告知服务器用户的邮箱,仅仅是留下一个联系方式。
5.Host
:
它将告知服务器,请求的资源所处的互联网主机名和端口号,Host首部字段是HTTP/1.1规范中唯一一个必须包含在请求首部内的首部字段。由于一个IP地址下可能存在多个域名,所以需要Host来告诉服务器具体请求的是哪个资源。
6.Range
:
范围请求,告知服务器索取资源的范围。如:Range: bytes = 5000-10000
意为请求获取从第5000个字节到10000个字节的资源。若获取成功,会抛出206,返回范围资源;失败,则抛出200,返回所有资源。
7.If-Match/If-Modified-Since/If-None-Match/If-Range/If-Unmodified-Since
:
形如If-xxx
的这种请求首部字段称为条件请求,意为服务器只有满足条件请求的内容,才会执行请求。
-
If-Match
:只有它的值与想要获取资源的实体标记(Etag)值相等时,服务器才会返回资源。 -
If-Modified-Since
:如果在该字段指定的时间早于资源更新时间,则处理该请求。反之,则抛出304,使用缓存即可。 -
If-Range
:范围请求,与Range字段一同使用。如果其值与实体标记(Etag)值相等,则返回指定的范围资源。若不等,则抛出200,返回所有资源。 -
If-None-Match/If-Unmodified-Since
:If-Match/If-Modified-Since
否定方法。
8.Max-Forwards
:通过TRACE方法或OPTIONS方法时,发送包含字段请求时,将以十进制形式指定经过服务器的最大数目。例如:Max-Forwards:3
,规定经过服务器数目为3,没经过一个服务器其值将会-1,当其值为0时,所在服务器强制返回响应。
9.Refer
:
告知服务器请求原始资源的URL,出于安全性考虑也可以考虑不发送该字段。
10.TE
:
告知服务器客户端能够处理的传输编码方式及其优先级,他与Accept-Encoding很像,但仅用于传输编码。
11.User-Agent
:该字段会将创建请求的浏览器及用户代理等信息传达个服务器。