HTTP/1.1 通用首部字段
通用首部字段是指,请求报文和响应报文双方都会使用的首部。
1.Cache-Control
通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。
指令的参数是可选的,多个参数之间通过 ,
分隔。首部字段 Cache-Control
的指令可用于请求及响应时。
Cache-Control:private, max-age=0, no-cache
1.1. Cache-Control 指令一览
缓存请求指令
指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age=[秒] | 必需 | 相应的最大值 |
max-stale(= [秒]) | 可省略 | 接收已过期的响应 |
min-fresh=[秒] | 必需 | 期望在指定时间内的响应仍有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存获取资源 |
cache-extension | - | 新指令标记(token) |
缓存响应指令
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存服务器不能对资源进行缓存 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必须再向源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒] | 必需 | 响应的最大 Age 值 |
s-maxage=[秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
这里仅挑选几个重要的指令来解释
no-cache
no-cache:为了防止从缓存中返回过期的资源。
如果请求中包含 no-cache,表示客户端不会接受缓存过的响应。“中间”的缓存服务器必须把客户端请求转发给源服务器。
如果源服务器返回的响应中包含 no-cache,那么缓存服务器也不能对资源进行缓存。
如果服务器返回的响应中 no-cache 包含参数值,就表示当客户端接收到这个被指定的参数值的首部字段对应的响应报文后,就不能使用缓存。另外就是 no-store 表示真正的不允许缓存。
Cache-Control:no-cache=Location
max-age
Cache-Control:max-age=604800(单位:秒)
当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0 ,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 max-age 时,此时表示资源缓存的最长时间,缓存服务器不再对资源的有效性进行确认。
在 HTTP/1.0 版本中,当 Expires 和 max-age (同时出现时),会优先处理 max-age 指令,忽略 Expires。
min-fresh
Cache-Control:min-fresh=60(单位:秒)
min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。当指定 min-fresh=60 后,过了60秒的资源都无法作为响应返回了。
max-stale
Cache-Control:max-stale=3600(单位:秒)
该指令表示即使过期也照常接收。
如果未指定参数值,则表示无论过期多长时间都会接收
only-if-cached
Cache-Control:only-if-cached
表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。———— 该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout。
must-revalidate
Cache-Control:must-revalidate
使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。
若代理无法连通源服务器,缓存必须给客户端一条 504(Gateway Timeout)状态码。
注意:使用 must-revalidate 会忽略 max-stale 。
proxy-revalidate
Cache-Control:proxy-revalidate
该指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
no-transform
Cache-Control:no-transform
该指令规定无论在请求还是响应中,缓存都不能该表实体主体的媒体类型。
这样可防止缓存或代理压缩图片等类似操作。
2.Connection
Connection的作用如下
- 控制不再转发给代理的首部字段
- 管理持久连接
下面依次来对每个作用做说明
2.1 控制不再转发给代理的首部字段
Connection:不再转发的首部字段名
在客户端发送请求和服务器返回响应内,使用该首部字段,可控制不再转发给代理的首部字段
2.2 管理持久连接
Connection:close
HTTP/1.1 版本默认连接都是持久连接。为此,客户端会在持久连接上持续发送请求。当服务器想明确断开连接时,则指定 Connection 首部字段的值为 Close。
HTTP/1.1 之前的 HTTP 版本默认连接都是非持久连接。为此,如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定 Connection 首部字段值为 Keep-Alive。
如下图①所示,客户端发送请求给服务器时,服务端会像下图②那样加上首部字段 Keep-Alive 及首部字段 Connection 后返回响应。
3. Trailer
该字段会向服务器说明在报文主体后面记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。
Trailer: Expires
···报文主体···
0
Expires:Tue,28 Sep 2004 23:59:59 GMT
上面指定值为 Expires,在报文主体之后(分块长度0之后)出现了首部字段 Expires。
4. Upgrade
该字段用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
上图中,Upgrade字段值指定为 TLS/1.0。此时其字段产生作用的对象仅限于客户端和邻接服务器之间。
5. Via
Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后在进行转发。
另外,该字段还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。
6. Warning
该字段通常会告知用户一些与缓存相关的问题的警告。
其格式如下。最后的日期时间部分可省略。
Warning:[警告码] [警告的主机:端口号] "[警告内容]" ([日期时间])
HTTP/1.1 警告码
警告码 | 警告内容 | 说明 |
---|---|---|
110 | Response is stale(响应已过期) | 代理返回已过期的资源 |
110 | Revalidation failed(再验证失败) | 代理再验证资源有效性时失效(服务器无法到达等原因) |
112 | Disconnection operation(断开连接操作) | 代理与互联网连接被故意切断 |
113 | Heuristic expiration(试探性过期) | 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下) |
199 | Miscellaneous warning(杂项警告) | 任意的警告内容 |
214 | Transformation applied(使用了转换) | 代理对内容编码或媒体类型等执行了某些处理时 |
299 | Miscellaneous persistent warning(持久杂项警告) | 任意的警告内容 |