请求与响应Cache-Control max-age差异及请求max-age=0与其他值区别
请求与响应
max-age不同时的缓存行为,及请求头max-age=0与其他值的区别 先理清两个max-age的核心作用
- 响应头
Cache-Control: max-age=3600:服务器告知浏览器,该资源的缓存新鲜期为3600秒——在此期间内,缓存处于「新鲜状态」,浏览器可直接使用,无需与服务器通信。 - 请求头
Cache-Control: max-age=XXX:浏览器告知服务器,仅接受新鲜时长不超过XXX秒的缓存。注意:这并非浏览器直接判定缓存过期的阈值,而是触发条件请求的规则。
你遇到的场景解析
当服务器响应max-age=3600,浏览器请求头设max-age=60时:
- 缓存创建后的60秒内:缓存新鲜时长≤60秒,符合浏览器要求,直接使用缓存,不发起请求。
- 60秒后到3600秒内:缓存新鲜时长超过60秒,但仍在服务器规定的3600秒新鲜期内。此时浏览器不会直接丢弃缓存,而是发送条件请求(携带
If-Modified-Since或If-None-Match头),询问服务器资源是否更新。- 若服务器返回
304 Not Modified,浏览器继续使用现有缓存; - 若服务器返回新资源(200状态),则替换缓存并使用新内容。
你看到的「仍在使用缓存」,实际是服务器返回304后复用了缓存,而非浏览器直接跳过验证步骤。
- 若服务器返回
请求头max-age=0与max-age=N(N>0)的核心区别
1. max-age=0的行为
无论缓存处于何种状态(哪怕刚创建1秒),浏览器都会强制发送条件请求到服务器验证缓存有效性:
- 服务器返回304,就继续使用缓存;
- 服务器返回200,则更新缓存并使用新资源。
你所说的「不使用缓存」,本质是它不会直接读取本地缓存,必须先经服务器验证,而非完全弃用缓存。
2. max-age=N(N>0)的行为
浏览器会先计算缓存的新鲜时长(当前时间 - 资源响应时间):
- 若新鲜时长 ≤ N:直接使用本地缓存,不与服务器通信;
- 若新鲜时长 > N,但缓存仍在响应头的
max-age范围内:发送条件请求验证,验证通过则复用缓存; - 若缓存已超过响应头的
max-age:直接视为过期缓存,发送条件请求(或按其他缓存规则处理)。
关键总结
- 请求头
max-age=N(N>0)是「允许直接使用的缓存最大新鲜时长」,阈值内直接用,超阈值则验证; - 请求头
max-age=0是「强制验证缓存」,不管缓存多新,都要先确认服务器端资源是否可用。
内容的提问来源于stack exchange,提问作者M7mod Bakr
相关产品推荐
相关产品推荐

