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章
- 4 HTTP 首部(一):通用首部字段
- 略说HTTP协议(三:首部字段简介及通用首部字段)
- HTTP首部(一)
- HTTP详解--通用首部字段解析(九)
- 5 HTTP 首部(二):请求首部字段
- 6 HTTP 首部(三):响应首部字段
- 7 HTTP 首部(四):其它首部字段
- Http首部字段
- HTTP首部字段
- Http协议基础之HTTP通用首部字段
- HTTP详解--请求首部字段(十)
- HTTP详解--响应首部字段(11)
- Http详解--实体首部字段(12)
- HTTP首部(一)
- HTTP首部行可选字段
- HTTP全部报文首部字段
- Http/1.1 首部字段一览
- HTTP协议之首部字段
- NSURLRequest详解
- 成为JavaGC专家(1)—深入浅出Java垃圾回收机制
- Java中系统属性Properties介绍 System.getProperty()参数大全
- Android 在代码中设置控件属性
- XML转plist
- 4 HTTP 首部(一):通用首部字段
- Android Support ;v4、v7、v13的区别
- android-NGN-stack中文文档
- c语言
- Java知识二:泛型
- Android 内存泄露分析
- Android中 查看数据库文件的方法
- MySQL语句
- http简单总结下