4 HTTP 首部(一):通用首部字段

来源:互联网 发布:王亮亮php 编辑:程序博客网 时间:2024/05/08 07:11

Cache-Control 控制缓存的行为

Cache-Control: private, max-age=0, no-cache

缓存请求和响应通用指令

no-cache 请求表示强制向源服务器再次验证;响应表示缓存前必须先确认其有效性,可省略,是默认值

  • 目的是为了防止从缓存中返回过期的资源

  • 如果是请求,返回服务器必须把客户端请求转发给源服务器

  • 如果是响应,缓存服务器不能对资源进行缓存。源服务器以后也不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作

  • 若响应报文中,对 no-cache 指定了具体的参数值,比如 Cache-Control: no-cache=Location,表示客户端在接收到这个被指定参数值的首部字段对应的报文后,不使用缓存,无参数值的首部字段仍然可以使用缓存

no-store 不缓存请求或响应的任何内容

  • no-cache 是不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源;no-store 才是真正地不进行缓存

no-transform 代理不可更改媒体类型

  • 无论是请求还是响应,缓存都不能改变实体主体的媒体类型

  • 防止缓存或代理压缩图片等类似操作

max-age = [秒] 响应的最大 Age 值

  • 请求中含有该字段,如果判定缓存资源的缓存时间数值比该字段指定数值更小,那么客户端就接收缓存的资源。如果 max-age 值为 0,那么缓存服务器将请求转发给源服务器

  • 响应中含有该字段,缓存服务器不对资源有效性再作确认,max-age 值代表资源保存为缓存的最长时间

  • Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),例如 Expires: Thu, 01 Dec 1994 16:00:00 GMT,等同 max-age 的效果。但是如果同时存在,HTTP/1.1 中处理 max-age,而忽略 Expires

cache-extension 新指令标记(token)

  • 可以扩展 Cache-Control 首部字段内的指令,如 Cache-Control: private, community=”UCI”,添加了一个全新的指令 community

  • 如果缓存服务器不能理解 community 这个新指令,会直接忽略

  • 仅对能理解它的缓存服务器来说是有意义的

缓存请求指令

max-stale = ([秒]) 接收已过期的响应,参数可省略

  • 指示缓存资源,即使过期也正常接收

  • 如果该指令未指定数值,那么无论过多久,客户端都会接收响应

  • 如果指定了数值,即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收

min-fresh = [秒] 期望在指定时间内的响应仍有效

  • 缓存服务器返回至少还未过指定时间的缓存资源

  • 比如,当值为 60 秒,那么过了 60 秒的资源都无法作为响应返回

only-if-cached 从缓存获取资源

  • 要求缓存服务器不重新加载响应,也不会再次确认资源有效性

  • 若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout

缓存响应指令

public 可向任意方提供响应的缓存

  • 明确表明其他用户也可利用缓存

private 仅向特定用户返回响应,可省略,即默认值

  • 缓存服务器会对该特定用户提供资源缓存的服务

  • 对于其他用户发送过来的请求,代理服务器不会返回缓存

must-revalidate 可缓存但必须再向源服务器进行确认

  • 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效

  • 若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504 状态码

  • 该指令会忽略请求的 max-stale

proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认

  • 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性

s-maxage = [秒] 公共缓存服务器响应的最大 Age 值

  • 功能和 max-age 一样

  • 区别在于 s-maxage 只适用于供多位用户使用的公共缓存服务器(一般指代理),对于同一用户重复返回响应的服务器来说,这个指令无任何作用

  • 当使用这个字段时,忽略对 Expires 首部字段及 max-age 指令的处理

Connection 逐跳首部、连接的管理

控制不再转发给代理的首部字段

GET / HTTP/1.1Upgrade: HTTP/1.1Connection: Upgrade

如上面的请求,在经过代理服务器后,会将 Upgrade 删除后再转发给源服务器

管理持久连接

Connection: close

  • HTTP/1.1 默认连接都是持久连接,当服务器想明确断开连接时,则指定其为 close

Connection: Keep-Alive

  • HTTP/1.1 之前的默认连接都是非持久连接,如果想在旧版本 HTTP 协议上维持持久连接,则指定其值为 Keep-Alive

Data 创建报文的日期时间

  • 使用 RFC1123 中规定的日期时间格式,Date: Tue, 03 Jul 2012 04:40:59 GMT

  • 旧版本 HTTP

    • 使用 RFC859 定义的格式,Date: Tue, 03-Jul-12 04:40:59 GMT

    • 另一种格式 Date: Tue Jul 03 04:40:59 2012

Pragma 报文指令

  • HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义

  • 只有一种形式 Pragma: no-cache,表示客户端会要求所有的中间服务器不返回缓存的资源

  • 若中间服务器都能以 HTTP/1.1 为基准,直接用 Cache-Control: no-cache 即可,但实际上不能掌握所有中间服务器的协议版本,所以要同时包含这两个

Cache-Control: no-cachePragma: no-cache

Trailer 报文末端的首部一览

会事先说明在报文主体后记录了哪些首部字段。可应用在 HTTP/1.1 分块传输编码时

Trailer: Expires... 报文主体 ...0Expires: Sta, 28 Nov 2015 23:00:00 GMT

指定了 Trailer 值为 Expires,在报文主体之后(分块长度 0 之后)出现首部字段 Expires

Transfer-Encoding 指定报文主体的传输编码方式

仅对分块传输编码有效

Upgrade 升级为其他协议

  • 用于检测 HTTP 协议及其它协议是否可使用更高的版本进行通信,参数值可以用来指定一个完全不同的通信协议

  • 使用 Upgrade 时,还需要指定 Connection: Upgrade

Upgrade: TLS/1.0, HTTP/1.1Connection:Upgrade

Upgrade 对象仅限于客户端和邻接服务器之间

  • 服务器可用 101 Switching Protocols 状态码作为响应返回

Via 代理服务器的相关信息

  • 追踪客户端和服务端之间的请求和响应报文的传输路径

  • 还可避免请求回环的发生,所以必须在经过代理时添加该字段

  • 经过一个代理服务器时,加了一条信息,1.0 表示代理服务器使用的是 HTTP/1.0,又经过一台代理服务器时,又加了一条信息

GET HTTP/1.1Via: 1.0 xx.xx.com(Squid/3.1),    1.1 yy.yy.com(Squid/2.7)

Warning 错误通知

  • 通常会告知用户一些与缓存相关的问题和警告

  • 格式如下。最后的日期时间部分可省略

Warning: [警告码] [警告的主机 : 端口号] “[警告内容]” ([日期时间])

  • 警告码

    • 110 Response is stale(响应已过期),表示代理返回已过期的资源

    • 111 Revalidation failed(再验证失败),表示代理再验证资源有效性失败(服务器无法到达等原因)

    • 112 Disconnection opreation(断开连接操作),表示代理与互联网连接被故意切断

    • 113 Heuristic expiration(试探性过期),表示响应的使用期超过 24 小时(有效资源的设定时间大于 24 小时的情况下)

    • 199 Miscellaneous warning(杂项警告),表示任意的警告内容

    • 214 Transformation applied(使用了转换),表示代理对内容编码或媒体类型等执行了某些处理时

    • 299 Miscellaneous persistent warning 任意的警告内容


参考:《图解HTTP》第6章

0 0