HTTP 表示分拣台 · /report/weekly

同一个 URL,为什么不能只缓存一份?

让客户端 A 和 B 带着不同偏好连续到达。服务器只能从现有库存里选择,而共享缓存必须知道:哪些请求头改变了这次选择。

一、填写两张偏好单

直接修改 ;q= 后的 0~1;省略 q 等于 1,q=0 表示拒绝。

A数据客户端

B网页客户端

权重表达的是偏好,不是命令。这个教学服务器会把三项可接受度相乘,再以自己的库存优先级打破平局;真实服务器可以采用别的合法选择策略。

二、检查服务端库存

取消库存可主动制造 406。

只有三个维度都可接受的表示才进入候选集。最高组合权重若并列,库存优先级较高者胜出。

协商结果

预览客户端 A

三、让 A → B 连续经过共享缓存

改变 Vary 会清空缓存,避免把两种缓存键规则混在一起。

Vary 关闭:缓存键只有 URL 响应头:Vary: —
请求轨迹

还没有请求。先连续发送 A → B,观察第二次从哪里得到响应。

当前共享缓存

缓存为空

同一组偏好的自动对照

下方始终重新模拟两次请求,不受上方手动缓存影响。

关键不是“Vary 让缓存失效”,而是它扩展了缓存键。不同偏好会进入不同格子;相同偏好的后续请求仍然可以正确命中。