客户端请求与服务端响应分别适用哪些Cache-Control头部取值?
Cache-Control 取值适用场景及常见疑问解答
取值适用场景区分
仅适用于请求头的取值
max-stale:客户端愿意接收超过过期时间的缓存,可指定时长阈值min-fresh:客户端要求缓存至少在指定时长内保持有效only-if-cached:客户端仅希望获取已缓存的内容,不要向源站发起请求
仅适用于响应头的取值
must-revalidate:缓存一旦过期就必须回源验证,不能直接使用过期内容proxy-revalidate:作用类似must-revalidate,仅对共享缓存(比如CDN、代理服务器缓存)生效s-maxage:指定共享缓存的存储时长,优先级高于max-agepublic:标记响应可以被任何缓存(包括共享缓存、私有缓存)存储private:标记响应只能被用户端的私有缓存存储,不能被共享缓存存储immutable:标记响应内容不会变更,缓存有效期内无需回源验证
同时适用于请求头和响应头的取值
max-age:请求头中表示客户端愿意接收有效期不超过指定时长的缓存;响应头中表示该资源在缓存中的最大有效时长no-store:请求头中表示客户端不要缓存本次请求和对应的响应内容;响应头中表示所有缓存都不要存储本次请求和响应的任何内容no-cache:请求头中表示客户端不要直接使用已有缓存,必须回源验证资源是否更新;响应头中表示缓存可以存储该资源,但每次使用前都必须回源验证no-transform:请求头中表示代理服务器不要修改请求和响应的内容(比如不要压缩转码);响应头中同理要求中间节点不要修改响应内容
常见问题解答
no-store应该用在请求头还是响应头中?
两者都可以用,取决于你的需求:
- 如果你是客户端开发者,不希望本次请求的敏感内容被本地/中间代理缓存,就加在请求头里
- 如果你是服务端开发者,希望所有收到该响应的节点都不要缓存敏感内容,就加在响应头里,优先级更高
no-cache只能用于请求头吗?
不是,no-cache同时支持请求头和响应头两种场景。
如果将no-cache用在响应头而非请求头中,会产生什么效果?
此时该响应会被缓存存储,但后续任何客户端想要使用这个缓存之前,都必须先回源站验证资源是否有更新,验证通过才能使用缓存,不能直接读取本地缓存返回。
同时在请求头和响应头中使用该取值是否有意义?
有意义,属于双重保险的场景:
- 服务端加了响应头
no-cache,保证所有缓存节点都遵守每次使用前回源验证的规则 - 客户端加了请求头
no-cache,相当于主动要求跳过现有缓存的验证逻辑直接拿最新内容,即便某些中间节点没有严格遵守响应头的no-cache规则,客户端的请求头也能强制触发回源拿最新内容
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

