Cache-Control 常见配置值

HTTP 缓存控制头 Cache-Control 在请求和响应中的配置项说明

问题

Cache-Control 有哪些常见配置值,它们分别在请求和响应中如何使用?

解答

Cache-Control 包含请求首部和响应首部两类配置值。

请求首部配置

no-cache

客户端请求时携带此字段,中间缓存服务器不会直接使用缓存,而是转发给源服务器验证资源是否过期。如果未过期,源服务器会告知可以使用缓存;否则返回新资源。

no-store

表示请求或响应内容包含机密信息,禁止缓存该内容。

max-age

指定客户端不愿接收超过设定时间的响应。需要配合响应中的 max-age 才能实现缓存控制。

Cache-Control: max-age=3600

max-stale

允许使用过期的缓存。例如 max-age 为 60 秒,max-stale 为 60 秒,则实际缓存时长为 120 秒。

min-fresh

设定最小新鲜度要求。客户端不接受新鲜度不足 (当前 age + min-fresh) 的响应。

only-if-cached

客户端仅在缓存服务器有本地缓存时才要求返回。如果本地无缓存,返回 504 Gateway Timeout。

no-transform

禁止缓存改变实体主体的媒体类型。

cache-extension

扩展 Cache-Control 首部字段的自定义指令。

响应首部配置

public

表明所有用户都可以通过缓存服务器缓存该资源。

private

与 public 相对,表明只有特定用户可以缓存该资源。

no-cache

缓存服务器不能直接使用缓存,必须向源服务器验证资源有效性。

no-store

同请求首部,禁止缓存机密信息。

no-transform

同请求首部,禁止改变媒体类型。

max-age

设置缓存有效期。客户端在缓存未过期时不会向服务器请求数据。

Cache-Control: max-age=86400

当请求和响应同时设置 max-age 时:

  • 如果请求中的 max-age 小于响应中的值,客户端会按请求中的时间周期刷新
  • 即使响应缓存未过期,请求的 max-age 过期后也会发起网络请求
  • 建议用响应的 max-age 控制缓存时间,用请求的 max-age 控制刷新机制

HTTP/1.1 缓存服务器会优先处理 max-age,忽略 Expires 首部;HTTP/1.0 则相反。

s-maxage

类似 max-age,但仅适用于公共缓存服务器(供多用户使用)。

must-revalidate

代理必须向源服务器验证缓存是否有效。如果无法连通源服务器,必须返回 504 状态码。该指令会忽略请求中的 max-stale。

proxy-revalidate

要求所有缓存服务器在返回响应前必须验证缓存有效性。

cache-extension

同请求首部,用于自定义扩展指令。

关键点

  • no-cache 不是不缓存,而是需要验证后才能使用缓存;no-store 才是完全禁止缓存
  • public 和 private 控制缓存的共享范围,前者允许所有用户缓存,后者仅限特定用户
  • max-age 在请求和响应中同时存在时,请求中的值控制刷新频率,响应中的值控制缓存时长
  • must-revalidate 会忽略 max-stale,强制验证缓存有效性
  • HTTP/1.1 中 max-age 优先级高于 Expires