You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

条件请求返回304 Not Modified时,max-age是否自动更新?

304 Not Modified响应不会自动更新max-age,需服务器显式处理

嘿,这个问题戳中了HTTP缓存里很容易混淆的点,我来给你讲明白:

简单说:不会自动新增60秒有效期。如果服务器在304响应里不做显式处理,浏览器不会把缓存的max-age自动往后顺延。

具体场景拆解

假设你第一次请求资源时,服务器返回200 OK,响应头包含:

Cache-Control: max-age=60
ETag: "abc123"

此时浏览器会把资源缓存60秒,从第一次响应的时间点开始计算(比如10:00:00收到响应,缓存到10:01:00过期)。

1分钟后(10:01:00),缓存过期,浏览器发送条件请求,带上If-None-Match: "abc123"检查资源是否变化。如果ETag没改,服务器返回304 Not Modified。

这时候分两种情况:

  • 情况1:服务器在304响应里没有重新发送Cache-Control
    浏览器会继续沿用最初的缓存策略,但不会自动将有效期延长60秒。也就是说,这个缓存的“过期时间”还是10:01:00,下一次再使用这个资源时(比如10:01:30),浏览器依然会发送条件请求验证资源,不会直接用缓存。

  • 情况2:服务器在304响应里显式设置Cache-Control: max-age=60
    浏览器会更新缓存的有效期,从收到304响应的时间点(比如10:01:02)开始,再往后加60秒,也就是到10:02:02才会过期。下一次在10:02:00使用资源时,浏览器会直接用缓存,不用发请求。

为什么要这样设计?

HTTP缓存的规则是为了兼顾性能和资源新鲜度:如果自动延长max-age,可能会导致用户长时间使用旧资源,而服务器无法控制缓存时长。让服务器显式设置,才能让开发者精准控制缓存的生命周期。

内容的提问来源于stack exchange,提问作者TomDane

火山引擎 最新活动