请求头中设置Cache-Control: max-age=20及非零max-age参数的作用是什么?
请求头中
Cache-Control: max-age=xxx(xxx≠0)的作用与行为 Great question—this is one of those Cache-Control nuances that trips up a lot of folks because request and response headers reuse the same directives but serve totally different purposes. Let’s break this down clearly:
核心作用
请求头里的max-age=<seconds>是客户端(浏览器、API客户端等)向缓存层(浏览器缓存、中间代理缓存)提出的要求,翻译成人话就是:
“我只接受缓存时间不超过
<seconds>秒的新鲜资源。如果缓存里的资源已经存了更久,别直接给我,去源服务器验证或重新获取;如果还在<seconds>秒以内,直接返回缓存就行。”
这和响应头里的max-age完全相反:响应头的max-age是服务器强制规定缓存的有效期,而请求头的max-age是客户端主动对缓存的新鲜度设限。
具体行为(以max-age=20为例)
根据缓存条目的新鲜度,会触发两种不同的逻辑:
- 缓存条目新鲜(存储时间<20秒):缓存层直接返回缓存的资源,不会向源服务器发起请求。这个效果看起来和响应头
max-age=20生效时类似,但本质是客户端主动允许使用新鲜缓存,而非服务器强制要求缓存。 - 缓存条目不新鲜(存储时间≥20秒):缓存层会执行和
max-age=0相同的逻辑:向源服务器发送验证请求(携带If-Modified-Since或If-None-Match请求头)。如果服务器返回304 Not Modified,缓存层会更新该条目的新鲜度(重新计算有效期)后返回缓存;如果返回200 OK,则用新资源替换缓存并返回给客户端。
关键对比:请求头vs响应头max-age
| 位置 | max-age=20的含义 |
|---|---|
| 响应头 | 服务器告诉缓存:“这个资源你可以存20秒,20秒内直接返回给请求方” |
| 请求头 | 客户端告诉缓存:“我只接受20秒内的新鲜缓存,超过20秒的必须去源服务器验证或重新获取” |
举个实际例子:如果服务器响应头设了max-age=60,但客户端请求头设了max-age=20,那么缓存层只会返回存储时间≤20秒的资源;一旦缓存超过20秒,就会去源服务器验证,不会遵守服务器规定的60秒有效期。
内容的提问来源于stack exchange,提问作者planB
相关产品推荐
相关产品推荐

