Skip to main content

《图解HTTP》笔记

· 7 min read
Alan

《图解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,那么缓存服务器通常需要将请求转发给源服务器。
max-age 和 Expires 优先级

应用 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 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。