HTTP响应消息头
在HTTP响应消息中,第一行为响应状态行,紧接着的是若干响应消息头,服务器端通过响应消息头向客户端传递附加信息,包括服务程序名、被请求资源需要的认证方式、客户端请求资源的最后修改时间、重定向地址等信息。HTTP响应消息头的具体示例如下所示:
Server: Apache-Coyote/1.1
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Mon,18 Nov 2013 18:23:51 GMT
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
从上面的响应消息头可以看出,它们的格式和HTTP请求消息头的格式相同。当服务器向客户端回送响应消息时,根据情况的不同,发送的响应消息头也不相同,接下来,针对一些常用的响应消息头字段进行详细讲解。
1、Accept-Range
Accept-Range头字段用于说明服务器是否接收客户端使用Range请求头字段请求资源。如果服务器想告诉客户机不要使用Range头字段,则使用下面的头信息:
Accept-Range: none
如果服务器想告诉客户端可以使用以bytes为单位的Range请求,则应该使用下面的头信息:
Accept-Range: bytes
2、Age
Age头字段用于指出当前网页文档可以在客户端或代理服务器中缓存的有效时间,设置值为一个以秒为单位的时间数,具体示例如下所示:
Age: 1234567
客户端再次访问已缓存的某个网页文档内容时,先用当前的时间值减去服务器返回该网页时所设置的Date头字段值,如果结果值小于服务器上返回该网页时所设置的Age头字段的时间值,客户端直接使用缓存中的网页内容。否则,客户端将向服务器发出针对该页面的网页请求。
3、Etag
Etag头字段用于向客户端传送代表实体内容特征的标记信息,这些标记信息称为实体标签,每个版本的资源的实体标签是不同的,通过实体标签可以判断在不同时间获得的同一资源路径下的实体内容是否相同。比如在一个文档最后添加一个回车换行,Etag头字段的值就能标识出不同。Etag头字段的格式如下所示:
Etag: abc1234
4、Location
Location头字段用于通知客户端获取请求文档的新地址,其值为一个使用绝对路径的URL地址,如下所示:
Location: http://www.itcast.org
Location头字段和大多数3xx状态码配合使用,以便通知客户端自动重新连接到新的地址请求文档。由于当前响应并没有直接返回内容给客户端,所以使用Location头的HTTP消息不应该有实体内容,由此可见,在HTTP消息头中不能同时出现Location 和Content-Type这两个头字段。
5、Retry-After
Retry-After头字段可以与503状态码配合使用,告诉客户端在什么时间可以重新发送请求。也可以与任何一个3xx状态码配合使用,告诉客户端处理重定向的最小延时时间。Retry-After头字段的值可以是GMT格式的时间,也可是一个以秒为单位的时间数,具体示例如下:
Retry-After: Mon,18 Nov 2013 19:01:51 GMT
Retry-After: 120 // 120秒
6、Server
Server头字段用于指定服务器软件产品的名称,具体示例如下:
Server: Apache-Coyote/1.1
7、Vary
Vary用于指定影响了服务器所生成的响应内容的那些请求头字段名,具体示例如下:
Vary: Accept-Language
上面的响应头字段说明了服务器响应的内容受到了客户端发送的Accept-Language请求头的影响,服务器根据Accept-Language请求头的值,返回相应语言种类的网页内容。当客户端再次访问已经缓存的资源时,需要检查Vary头字段中指定的请求头字段,检查请求头字段的这次设置与上次的设置是否相同,以此作为是否使用缓存的条件。
例如,上次的请求中Accept-Language头字段的值为en-us,而这次的Accept-Language头字段的值为zh-cn,即使客户端使用请求资源路径的本地缓存的其他条件都成立,但客户端也不能使用缓存,它仍需向服务器发出访问请求。
8、WWW-Authenticate和Proxy-Authenticate
当客户端访问受口令保护的网页文件时,服务器会在响应消息中回送使401(Unauthrized)响应状态码和WWW-Authoricate响应头,指示客户端应该在Authorization请求头中使用WWW-Authoricate响应头指定的认证方式提供用户名和密码信息。WWW-Authenticate响应头中可以指定两种认证方式:BASIC和DIGEST,如果要求客户端采用BASIC方式传送认证信息,语法格式如下:
WWW-Authenticate: BASIC realm=”itcast”
其中,realm属性用于指定当前资源所属的域,域定义了同一个主机内的一个受保护区间(一组需要保护的资源),它可以是任意字符串。同一台主机上可以有多个域,相同的域内所有的资源都共享相同的账户。如果某个账户具有访问某个资源的权限,那么该账户就能访问同一个域中的其他资源。根据HTTP验证的规范,与某一资源具有相同的目录路径或位于其目录路径的子目录中的资源,与该资源使用相同的域。
DIGEST认证方式细节比较复杂,想对其进行深入研究的读者可以参阅RFC2617文档。
Proxy-Authenticate头字段是针对代理服务器的用户信息验证,其它的作用与用法与WWW-Authenticate头字段类似。
9、Refresh
Refresh头字段用于告诉浏览器自动刷新页面的时间,它的值是一个以秒为单位的时间数,具体示例如下所示:
Refresh:3
上面所示的Refresh头字段用于告诉浏览器在3秒后自动刷新此页面。
需要注意的是,在Refresh头字段的时间值后面还可以增加一个URL参数,时间值与URL之间用分号(;)分隔,用于告诉浏览器在指定的时间值后跳转到其它网页,例如告诉浏览器经过3秒跳转到www.itcast.cn
网站,具体示例如下:
Refresh:3;url=http://www.itcast.cn
10、Content-Disposition
如果服务器希望浏览器不是直接处理响应的实体内容,而是让用户选择将响应的实体内容保存到一个文件中,这需要使用Content-Disposition头字段。Content-Disposition头字段没有在HTTP的标准规范中定义,它是从RFC2183中借鉴过来的。在RFC2183中,Content-Disposition指定了接收程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment则要求用户干预并控制接收程序处理数据内容的方式。而在HTTP应用中,只有attachment是Content-Disposition的标准方式。attachment后面还可以指定filename参数。filename参数值是服务器建议浏览器保存实体内容的文件名称,浏览器应该忽略filename参数值中的目录部分,只取参数中的最后部分作为文件名。在设置Content-Disposition之前,一定要设置Content-Type头字段,具体示例如下:
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=lee.zip