通用头字段
在HTTP消息中,有些头字段既适用于请求消息也适用于响应消息,这样的字段被称为通用头字段。通用头字段有如下几种:Cache-Control 、Connection、Date、Pragma、Trailer、Transfer-Encoding、Upgrade、Via、Warning,关于这些通用头字段的相关讲解具体如下:
1、Cache-Control
如果Cache-Control用在请求消息中,它用于通知位于客户端和服务器端之间的代理服务器如何使用已缓存的页面,在这种情况下,Cache-Control的值可以是:no-cache、no-store、max-age、max-stale、min-fresh、no-transform、only-if-cached等。
如果Cache-Control用在响应消息中,它用于通知客户端和代理服务器如何缓存页面,在这种情况下,Cache-Control的取值可以为public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-max-age等。
在一个Cache-Control头字段中可以设置多个值,它们之间用逗号分隔,具体示例如下:
Cache-Control: no-stroe,no-cache,must-revalidage
在上面的Cache-Control头字段中,设置的每个值都有特定的含义,对Cache-Control头字段的一些常用值进行介绍说明,具体如表1所示。
表1 Cache-Control头字段的值
头字段值 | 说明 |
---|---|
public | 文档可以被任何客户端缓存 |
private | 文档只能被保存在单个用户的私有(非共享)缓存中 |
no-cache | 如果no-cache后没有指定字段名,则客户机和代理服务器不应该缓存该文档。也可以在no-cache后可以指定一个或多个其他的头字段名,这样代理服务器可以缓存该页面内容对以后的请求进行响应,但响应消息中不能包含no-cache后指定的头字段。例如,如果不想让客户端和代理服务器端缓存Cookie信息,可以使用no-cache=Set-Cookie。 |
no-store | 请求和响应信息都不应被存储在对方的磁盘系统上,存储与缓存是有区别的,缓存是指将信息保存在内存或磁盘系统中,而存储专指将信息保存在磁盘系统。 |
must-revalidate | 对于客户端的每次请求,代理服务器必须向服务器验证缓存的文档是否过时,以保证总是发送最新的文档给客户机。 |
proxy-revalidate | 除了只能用于共享缓存外,其作用与must-revalidate相同。 |
max-age=n | 在n秒后认为文档过时,它可以替代Expries头的作用,如果响应头同时给出Cache-Control头的max-age设置值和Expires头,则以Cache-Control头的max-age为准。 |
s-max-age=n | 在代理服务器中缓存的文档(通常称之为共享缓存)在n秒后过时。 |
2、Connection
Connection头字段用于指定处理完本次请求/响应后,客户端和服务器端是否还要继续保持连接。Connection头字段可以指定两个值,如下所示:
Connection: Keep-Alive
Connection: close
当Connection头字段的值为Keep-Alive时,客户端与服务器在完成本次交互后继续保持连接,当Connection头字段的值为close时,客户端与服务器在完成本次交互后关闭连接。对于HTTP1.1版本来说,默认采用持久连接,也就是说默认情况下,Connection头字段的值为Keep-Alive。
3、Date
Date头字段用于表示HTTP消息产生的当前时间,它的值为GMT格式,具体示例如下:
Date: Mon,18 Nov 2013 20:23:51 GMT
一般情况下,服务器返回的所有响应中必须包括一个Date头字段,除了下面这些情况:
● 响应状态代码表示服务器的错误,如500(内部服务器错误)或503(服务不可用),那么服务器就不可能产生一个有效的日期。
● 服务器没有时钟,不能提供当前时间,响应就不能设置Date头,这种情况下,服务器也不能设置如Expire、Last-Modified等这样的头字段。
4、Pragma
Pragma头字段主要在HTTP1.0中通知代理服务器和客户端如何使用缓存页面,它的值只能固定设置为no-cache,如下所示:
Pragma: no-cache
当Pragma头字段用于响应消息时,指示客户端不要缓存文档;当用于请求消息时,指示代理服务器必须返回一个最新的文档,而不能返回缓存的文档。在HTTP 1.0中,一些浏览器对Pragma头字段的支持不是非常可靠,因此,人们常常通过设置Expires头字段的值为0来实现同样功能。
而在HTTP 1.1中,Cache-Control头字段的也基本替代了Pragma头字段的使用。
5、Transfer-Encoding
对于HTTP1.0协议,服务器端和客户端不是持久化连接,当服务器端关闭了TCP连接,客户端就知道响应的数据已经发送完毕。而对于HTTP1.1来说,由于服务器端和客户端保持持久连接,服务器端必须在响应消息中通过Content-Length头字段通知客户端响应数据的长度,客户端才能知道数据何时传输完毕。然而,在服务器端,有些数据是动态生成的,服务器必须等到所有的内容都生成后才能准确地计算出响应数据的长度,也就是说只有当所有数据生成完毕后服务器端才能响应客户端的请求,这样势必会影响效率。为了解决这个问题,Transfer-Encoding头字段被引入,这个头字段指定响应消息的实体内容采用哪种传输编码方式,目前标准设置值只有chunked,具体示例如下:
Transfer-Encoding: chunked
当响应消息中设置了Transfer-Encoding头字段后,会把响应消息的整个实体内容分成一连串分段后再进行传输。每个分段的开始都是一个十六进制的数字,用来表示整个分段的大小。最后一个分段必须是0,用于表示整个chunked编码数据的结束,如下所示:
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
7f
<html>
<head>
<title>trailer Example</title>
</head>
<body>
<p>Please wait while we complete your transaction ...</p>
2c
<p>Transaction complete!</p>
</body>
</html>
0
上面的响应消息中,7f和2c代表两个分段内容的大小标识信息,所以这种情况下不必用Content-Length头字段来指定整个实体内容的大小。
6、Trailer
一些头字段可以放置在整个HTTP消息的尾部,也就是可以在实体内容部分之后放置头字段信息。对于放置在尾部的头字段,需要在消息头中使用Trailer字段说明,具体示例如下:
Trailer:Date
需要注意的是,Trailer头字段必须在chunked传输编码的方式下使用。
7、Upgrade
Upgrade头字段用在客户端,用于指定客户端想要从当前协议切换的新的通信协议。如果服务器端认为切换的协议合适,会在响应消息中设置Upgrade头字段指定切换的协议,Upgrade响应头字段需要和101(switching protocols切换协议)状态码配合使用,具体示例如下:
// 请求消息
GET / HTTP/1.1
Host: 127.0.0.1
Upgrade: TLS/1.0
// 响应消息
HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0
8、Via
Via头字段用于指定HTTP消息所途经的代理服务器所使用的协议和主机名称,这个头字段由代理服务器产生,每个代理服务器必须把它的信息追加到Via字段的最后,以反映HTTP消息途经的多个代理服务器的顺序,具体示例如下:
Via: HTTP/1.1 Proxy1,HTTP/1.1 Proxy2
如果代理服务器所使用的协议为HTTP协议,Via头字段中的协议名称可以省略,如下所示:
Via: 1.1 Proxy1,1.1 Proxy2
9、Warning
Warning头字段主要用于说明其它头字段和状态码不能说明的一些附加警告信息,例如提示代理服务器断开网络,如下所示:
Warning:112 Disconnected operation