强缓存、协商缓存怎么区分
先理解原理和示例,再练习完整口述与追问。
回答要点
新鲜缓存可直接复用;过期或要求校验时,可用 ETag / If-None-Match、Last-Modified / If-Modified-Since 做条件请求。304 不携带完整资源正文。
no-cache 表示复用前需校验,不等于不存储;no-store 才要求不存储。带内容 hash 的静态资源与 HTML 入口通常采用不同缓存策略。MDN:HTTP 缓存
原理拆解
先检查缓存能否直接复用,再检查是否需要校验。max-age 给出新鲜期,no-cache 允许存储但复用前通常要向服务端验证,no-store 则要求不存储。过期或要求验证时带 If-None-Match 等条件,资源未改变返回 304,客户端继续使用本地表示;改变则返回新内容。ETag 与 Last-Modified 是校验器,不是“缓存是否永久有效”的保证。
示例与推演
首次拿到 app.abcd.js,响应为 Cache-Control: public,max-age=31536000,immutable;文件内容变更就发布新 URL。HTML 可使用 Cache-Control:no-cache 和 ETag,每次校验是否有新入口。个性化 HTML 不应被所有用户共享缓存,需正确设置 private/no-store、Vary 和 CDN 策略。
易错点
强缓存命中通常没有一次正常业务网络请求;304 不携带新的响应内容。不要把 no-cache 翻译成“完全不缓存”,也不要用随机查询串作为长期唯一更新策略。
参考回答可直接练习口述
所谓强缓存是缓存仍新鲜时直接复用,常由 Cache-Control 的 max-age 等控制;需要重新验证时发送 ETag/If-None-Match 或 Last-Modified/If-Modified-Since,未变化可返回 304,客户端继续使用已有正文。no-cache 可以存,但复用前要按规则校验;no-store 要求不存。HTML 入口通常短缓存或校验,内容 hash 的静态资源可长缓存;用户私有数据还要避免共享缓存串用户。