知识卡片

Cache-Control取代Expires解决的三个缺陷

普通读书笔记卡

内容

HTTP强制缓存的思路很直接:约定一个时点前资源内容不会变,客户端在此之前 无须请求直接用本地缓存。HTTP/1.0的Expires用绝对截止时间实现这个约定, 但暴露出三个问题:一是依赖客户端本地时钟,用户手动调整系统时间就能让 缓存提前失效或超期持有;二是无法区分资源是否涉及用户身份——登录用户 私有缓存的数据如果被代理服务器或CDN也缓存下来,可能被其他未认证用户 获取;三是无法表达”不缓存”的语义,早期只能靠给URL加时间戳这种脚本 Tricks强制刷新。HTTP/1.1的Cache-Control用相对时间max-age替代绝对时间, 天然避开了客户端时钟依赖;用public/private参数显式声明资源是否可被 共享缓存持有;用no-cache/no-store分别表达”要重新验证”和”完全禁止保存” 两种不缓存语义。三个问题、三处针对性的设计,能看出协议演进往往是被真实 踩过的坑倒逼出来的,而不是一次性设计到位的。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第4章"透明多级分流系统" 4.1.1节"强制缓存"(源文件:_epub-src对应OEBPS/Text/chapter37.xhtml) - 结论依据:原文列出Expires受限于客户端时间、无法处理私有资源、无法 表达不缓存语义三个明显问题,并说明Cache-Control用max-age相对时间、 public/private、no-cache/no-store分别针对性解决,直接支撑本卡片结论。 - 原始内容:Expires是HTTP协议最初版本中提供的缓存机制……至少存在以下 几个明显问题:受限于客户端的本地时间……无法处理涉及用户身份的私有 资源……无法描述"不缓存"的语义……Cache-Control是HTTP/1.1协议中定义的 强制缓存Header,它的语义比Expires丰富了很多。