HTTP头中pragma: no-cache与expires过去日期配置的区别是什么?
HTTP不缓存相关头的核心差异
1. 适配标准与兼容性不同
Pragma:HTTP/1.0版本的遗留响应头,通用用法只有Pragma: no-cache这一种,仅用于兼容年代极久远、不支持HTTP/1.1的客户端,现代浏览器基本不会优先识别该头。Expires:同样是HTTP/1.0的产物,逻辑是指定一个绝对的GMT时间作为缓存到期节点,当客户端本地时间晚于该时间时就判定缓存失效。它的缺陷非常明显:完全依赖客户端本地时间的准确性,如果用户手动修改了系统时间,缓存判断就会完全失效。Cache-Control:HTTP/1.1版本推出的官方标准缓存控制头,优先级最高、功能最丰富,支持no-cache/no-store/max-age等多种指令,判断缓存有效性时使用相对时间逻辑,不受客户端本地时间影响,是目前行业通用的缓存控制方案。
2. 优先级规则不同
当多个缓存控制头同时存在时,优先级从高到低为:Cache-Control > Expires > Pragma。也就是说只要客户端支持HTTP/1.1能识别Cache-Control,另外两个头的配置会被自动忽略。
多header同时配置的原因
你看到YouTube Music同时配置多个不缓存头,是为了做全场景向下兼容:如果遇到不支持HTTP/1.1的极端古老客户端,无法识别Cache-Control,就会自动降级识别Expires或者Pragma的配置,保证不缓存的逻辑在所有客户端上都能生效,避免漏配导致的异常缓存问题。
常见误区说明
很多人会混淆no-cache和no-store的作用:
Cache-Control: no-cache不是完全禁止缓存,而是允许客户端存储缓存,但每次使用缓存前必须向服务器发起请求验证资源是否有更新,验证通过才能使用缓存。- 如果需要完全禁止客户端存储任何缓存,应该配置
Cache-Control: no-store。
内容的提问来源于stack exchange,提问作者Rin
相关产品推荐
相关产品推荐

