概述
通用首部字段是指,请求报文和响应报文双方都会使用的首部。
列表
通用首部 | 作用(请求报文和响应报文都可能使用) |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 管理持久连接:决定当前的事务完成后,是否会关闭网络连接 |
Date | 创建报文时间 |
Pragma | 兼容HTTP/1.0字段:只用于请求报文,客户端要求中间服务器不返回缓存的资源 |
Trailer | 允许发送方在分块发送的消息后面添加额外的元信息,常用于分块传输编码中。 |
Transfer-Encoding | 规定了传输报文主体时采用的编码方式:chunked 分块传输 |
Upgrade | 要求客户端使用的升级协议,需配合Connection: Upgrade 一起使用:websocket |
Via | 代理服务器相关信息,每经过一个代理服务器就会添加相关信息,用逗号分割 |
Warning | 缓存相关问题的警告 |
Cache-Control
可缓存性
public
(客户端、代理服务器都可利用缓存)
private
(发起请求的浏览器才可以缓存,代理服务器不可用缓存)
no-cache
(本地可以用使用缓存,但需要服务器验证后才能使用)
no-store
(不做任何缓存)
到期
max-age=200
(服务器缓存到期时间, 秒)
s-maxage=200
(代理服务器缓存的到期时间, 秒)
Connection
管理持久连接:决定当前的事务完成后,是否会关闭网络连接。
Http协议1.1之后默认都是keep-alive(持久连接),1.0则是close(非持久连接)。
Connection: keep-alive
Connection: close
Date
表明创建 HTTP 报文的日期和时间。
Date: Tue, 03 Jul 2012 04:40:59 GMT
Pragma
Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。
规范定义的形式唯一,如下所示。
Pragma: no-cache
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。
所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 CacheControl: no-cache 指定缓存的处理方式是最为理想的。但要整体掌握全部中间服务器使用的 HTTP 协议版本却是不现实的。因此,发送的请求会同时含有下面两个首部字段。
Cache-Control: no-cache
Pragma: no-cache
Trailer
首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Content-Type: text/html
...
Transfer-Encoding: chunked
Trailer: Expires
...(报文主体)...
0
Expires: Tue, 28 Sep 2004 23:59:59 GMT
以上用例中,指定首部字段 Trailer 的值为 Expires,在报文主体之后(分块长度 0 之后)出现了首部字段 Expires。
Transfer-Encoding
规定了传输报文主体时采用的编码方式。
HTTP/1.1 的传输编码方式仅对分块传输编码有效。
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800
Content-Type: text/javascript; charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
cf0 ←16进制(10进制为3312)
...3312字节分块数据...
392 ←16进制(10进制为914)
...914字节分块数据...
0
Upgrade
首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
GET /index.htm HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
------------------>
<------------------
HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
上图用例中,首部字段 Upgrade 指定的值为 TLS/1.0。请注意此处两个字段首部字段的对应关系,Connection 的值被指定为 Upgrade。Upgrade 首部字段产生作用的 Upgrade 对象仅限于客户端和邻接服务器之间。因此,使用首部字段 Upgrade 时,还需要额外指定Connection:Upgrade。
对于附有首部字段 Upgrade 的请求,服务器可用 101 Switching Protocols 状态码作为响应返回。
Via
使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。
首部字段 Via 不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。
客户端:
GET / HTTP/1.1
代理服务器A:
GET / HTTP/1.1
Via: 1.0 gw.hackr.jp (Squid/3.1)
代理服务器B:
GET / HTTP/1.1
Via: 1.0 gw.hackr.jp (Squid/3.1), 1.1 a1.example.net(Squid/2.7)
源服务器
上图用例中,在经过代理服务器 A 时,Via 首部附加了“1.0 gw.hackr.jp (Squid/3.1)”这样的字符串值。行头的 1.0 是指接收请求的97服务器上应用的 HTTP 协议版本。接下来经过代理服务器 B 时亦是如此,在 Via 首部附加服务器信息,也可增加 1 个新的 Via 首部写入服务器信息。
Via 首部是为了追踪传输路径,所以经常会和 TRACE 方法一起使用。比如,代理服务器接收到由 TRACE 方法发送过来的请求(其中Max-Forwards: 0)时,代理服务器就不能再转发该请求了。这种情况下,代理服务器会将自身的信息附加到 Via 首部后,返回该请求的响应。
Warning
用于告知用户一些与缓存相关的问题的警告。
Warning 首部的格式如下。最后的日期时间部分可省略。
Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
Warning: 112 gw.hacker.jp:8080 "cache down" " Wed, 21 Oct 2015 07:28:00 GMT"
警告码表
警告码 | 警告内容 | 说明 |
---|---|---|
110 | Response is stale | 响应已过期:由缓存服务器提供的响应已过期(设置的失效时间已过)。 |
111 | Revalidation failed | 再验证失败:由于无法访问服务器,响应验证失败。 |
112 | Disconnection operation | 断开连接操作:缓存服务器断开连接。 |
113 | Heuristic expiration | 试探性过期:响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下) |
199 | Miscellaneous warning | 杂项警告:任意的警告内容 |
214 | Transformation applied | 使用了转换:由代理服务器添加,如果它对返回的展现内容进行了任何转换,比如改变了内容编码、媒体类型等。 |
299 | Miscellaneous persistent warning | 持久杂项警告:任意的警告内容 |