HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。
HTTP请求报文
在请求中,HTTP报文首部由以下几部分构成:
- 请求行:方法、URI、HTTP版本
- HTTP首部字段:
- 请求首部字段
- 通用首部字段
- 实体首部字段
HTTP响应报文
在响应中,HTTP报文首部由以下几个部分构成:
- 状态行:HTTP版本、状态码
- HTTP首部字段
- 响应首部字段
- 通用首部字段
- 实体首部字段
首部字段同时存在与请求和响应报文内,并涵盖HTTP报文相关的内容信息。
HTTP首部字段
HTTP首部字段是由首部字段名和字段值构成的,中间用冒号分隔。
HTTP首部字段根据实际用途被分为以下4种类型:
通用首部字段
请求报文和响应报文两方都会使用的首部请求首部字段
从客户端向服务器端发送请求报文时使用的首部。
补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。响应首部字段
从服务器端向客户端返回响应报文时使用的首部。
补充了响应的附加内容,也会要求客户端附加额外的内容信息。实体首部字段
针对请求报文和响应报文的实体部分使用的首部。
补充了资源内容更新时间等与实体有关的信息。
通用首部字段
请求报文和响应报文两方都会使用的首部。
Cache-Control
用于操作HTTP缓存。多个指令之间通过“,”分隔。
表示是否能缓存的指令
- public指令
Cache-Control:public
当指定使用public指令时,则明确表明其他用户也可以利用缓存。
- private指令
Cache-Control:private
当指定private指令后,响应只以特定的用户作为对象,这与public指令的行为相反。
缓存服务器会对该特定用户提供资源缓存的服务,对其他用户发送过来的请求则不会返回缓存。
- no-cache指令
Cache-Control:no-cache
使用no-cache指令的目的是为了防止从缓存中返回过期的资源。每次在使用缓存之前都强制发送请求给源服务器进行验证,检查文件该没改变
从字面上理解很容易以为no-cache表示不缓存,但事实上no-cache代表不缓存过期的资源,缓存会向服务器进行有效性确认后处理资源。
后面提到的no-store才是不缓存资源。
- no-store指令
Cache-Control:no-store
该指令规定缓存不能在本地存储请求或者响应。
与到期时间相关的指令
- s-maxage指令
Cache-Control:s-maxage=604800(单位:秒)
s-maxage指令的功能和max-age指令相同,它们的不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器(即一般代理)。
也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。
另外,使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。
- max-age指令
设置缓存存储的最大周期,超过这个时间缓存被认为过期
Cache-Control:max-age=604800(单位:秒)
当客户端发送的请求中包含max-age时,如果判定缓存资源的缓存时间比指定时间的数值更小,那么客户端就接受缓存的资源。
如果max-age指定为0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含max-age时,缓存服务器将不对资源的有效性再做确认,max-age代表资源保存为缓存的最长时间。
在同时遇到Expires首部字段和max-age时,会优先处理max-age指令而忽略掉Expires首部字段。
- min-fresh
Cache-Control:min-fresh=60
min-fresh指令要求缓存服务器返回还未过指定时间的缓存资源。
- max-stale指令
表示客户端愿意接收一个已经过期的资源。 可选的设置一个时间(单位秒),表示响应不能超过的过期时间。
Cache-Control:max-stale=3600
如果指令未指定参数值,那么无论经过多久客户端都会接受缓存。
如果指令中指定了具体数值,那么只接受过期时间处于指定数值内的缓存。
- only-if-cached
Cache-Control:only-if-cached
表示不要去获取新数据。客户端只希望获取缓存的响应,并且不去联系服务器去检查是否存在较新的副本。
与验证相关的指令
- must-revalidate
Cache-Control:must-revalidate
使用这个指令,代理会向源服务器再次验证缓存是否有效。
另外,使用这条指令会忽略max-stale指令。
- proxy-revalidate
Cache-Control: proxy-revalidate
与must-revalidate相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。
- no-transform
Cache-Control: no-transform
表示无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。
这样做可以防止缓存或代理压缩图片等类似操作。
Connection
这个首部具备以下两个作用:
控制不再转发
Connection:不再转发的首部字段名
在代理向服务器进行转发时,将会删除指定的首部字段。
管理持久连接
Connection:close
HTTP 1.1版本的默认连接都是持久连接。当服务器想明确断开连接时则指定Connection首部字段为Close。
Connection:Keep-Alive
之前旧版本的HTTP默认连接都是非持久连接,为此如果想在旧版本的HTTP协议上维持持续连接,则需要指定为keep-alive。
客户端发送请求给服务器时,服务器端返回的响应中的首部字段会加上Keep-Alive和Connection后返回。
Date
表明创建HTTP报文的日期和时间。
Date:Sat, 07 Jan 2017 11:52:19 GMT
Trailer
这个字段会事先说明在报文主体后记录了哪些首部字段。
这个字段可应用在分块传输编码。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Trailer: Expires
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT
可以看到在首部中Trailer指定了Expires字段。这个字段在报文主体的后面也出现了。
Transfer-Encoding
规定了传输报文主体时采用的编码方式。
Upgrade
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
为了追踪客户端与服务器之间的报文传输路径。
报文经过代理或者网关时,会现在首部字段Via中附加该服务器的信息然后再进行转发。
Via不仅用于追踪报文的转发,还可以避免请求回环的发生,所以必须在经过代理时附加该首部字段内容。
Via首部用于追踪传输路径,因此经常和TRACE方法一起使用。
Warning
会告知用户一些与缓存相关的问题的警告。