《图解HTTP》笔记
6.2 HTTP 首部字段
当 HTTP 报文首部中出现了两个或两个以上具有相同首部字段名时会怎么样? 这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
6.3 HTTP/1.1 通用首部字段
Cache-Control
通过Cache-Control
指令可以操作缓存的工作机制. 指令的参数是可选的,多个指令之间通过逗号分割:
Cache-Control: private, max-age=0, no-cache
Cache-Control
支持的指令按请求和响应分类如下:
缓存请求(Request)指令:
指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age=[秒] | 必需 | 响应的最大Age值 |
max-stale(=[秒]) | 可省略 | 接收已过期的响应 |
min-fresh=[秒] | 必需 | 期望在指定时间内的响应仍有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存获取资源 |
cache-extension | - | 新指令标记(token) |
缓存响应(Response)指令:
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必须再向源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒] | 必需 | 响应的最大Age值 |
s-maxage=[秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
是否能缓存的指令
Cache-Control: public
指令, 则明确表明其他用户也可利用缓存(CDN服务器可以缓存资源, 并返回给所有用户.)
Cache-Control: private
指令表示响应只以特定的用户作为对象, 这与 public
指令的行为相反. 缓存服务器(CDN)会对该特定用户提供资源缓存的服务. 对于其他用户发送过来的请求,代理服务器则不会返回缓存。
Cache-Control: no-cache
指令的目的是为了防止从缓存中返回过期的资源:
- 如果客户端发送的请求中如果包含
no-cache
指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。 - 如果服务器返回的响应中包含
no-cache
指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
no-cache
表示不缓存过期的资源, 缓存会向源服务器进行有效期确认后处理资源, 也就是说CDN不会缓存该资源.
控制可执行缓存的对象的指令
Cache-Control: no-store
指定规定缓存不能在本地存储请求或响应的任一部分
指定缓存期限和认证的指令
Cache-Control: maxage=604800
(单位 :秒) 指定资源保存为缓存的最长时间:
- 当服务器返回的响应中包含
max-age
指令时,缓存服务器将不对资源的有效性再作确认,而max-age
数值代表资源保存为缓存的最长时间。 - 当客户端发送的请求中包含
max-age
指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age
值为 0,那么缓存服务器通常需要将请求转发给源服务器。
应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires
首部字段的情况时,会优先处理 max-age
指令,而忽略掉 Expires
首部字段。而 HTTP/1.0 版本的缓存服务器的情况却相反,max-age
指令会被忽略掉。
Cache-Control: s-maxage=604800
s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 s-maxage 指令只适用于供多位用户使用的公共缓存服务器。当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及 max-age 指令的处理。
Cache-Control: must-revalidate
指令要求代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效
Cache-Control: proxy-revalidate
指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
Cache-Control: no-transform
指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。