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
目录