跳到主要内容

2. Cache-Status HTTP 响应头字段

Cache-Status HTTP 响应头字段指示缓存如何处理该响应及其对应请求. 此头字段的语法符合 [STRUCTURED-FIELDS].

其值是一个 List. List 的每个成员表示一个处理过该请求的缓存. 第一个成员表示最接近源服务器的缓存, 最后一个成员表示最接近用户的缓存 (如果用户代理自身缓存追加了一个值, 也可能包括它).

缓存决定何时适合向响应添加 Cache-Status 头字段. 有些缓存可能会把它添加到所有响应中, 另一些则可能只在专门配置时添加, 或在请求包含启用调试模式的头字段时添加. 相关安全考虑见第 6 节.

中间节点不应向它本地生成的响应追加 Cache-Status 成员, 即使该中间节点包含缓存也不应这样做, 除非生成的响应基于已存储响应 (例如, 304 (Not Modified) 和 206 (Partial Content) 都基于已存储响应). 例如, 代理因格式错误请求而生成 400 响应时, 不会添加 Cache-Status 值, 因为该响应由代理生成, 而不是由源服务器生成.

向 Cache-Status 头字段添加值时, 缓存应当保留现有字段值, 以允许调试处理该请求的整个缓存链.

每个 List 成员都标识插入它的缓存, 此标识符必须是 String 或 Token. 根据部署不同, 这可以是产品或服务名称 (例如 "ExampleCache" 或 "Example CDN"), 主机名 ("cache-3.example.com"), IP 地址, 或生成的字符串.

列表中的每个成员都可以带有参数, 用于描述该缓存对请求的处理. 虽然这些参数是可选的, 但鼓励缓存提供尽可能多的信息.

本规范定义以下参数.

2.1. hit 参数

hit 的值是 Boolean; 当为 true 时, 表示该请求由缓存满足, 也就是说, 它未被转发, 响应从缓存取得.

最初由源产生但被缓存修改的响应 (例如 304 或 206 状态码) 仍被视为命中, 只要它没有向前转发 (例如用于验证).

已经在缓存中但不向前转发就无法使用的响应 (例如因为它已陈旧或是部分响应) 不被视为命中. 注意, 不向前转发就使用的陈旧响应 (例如因为源服务器不可用) 可以视为命中.

hitfwd 互斥; 每个列表成员上只应出现其中一个.

2.2. fwd 参数

fwd 出现时, 表示请求向源方向转发; 其值是一个 Token, 指示原因.

以下参数值用于解释请求为何被转发, 从最具体到最不具体排列:

bypass: 缓存被配置为不处理此请求.

method: 请求方法的语义要求转发该请求.

uri-miss: 缓存不包含任何与请求 URI 匹配的响应.

vary-miss: 缓存包含与请求 URI 匹配的响应, 但无法基于此请求的头字段和已存储的 Vary 头字段选择响应.

miss: 缓存不包含任何可用于满足此请求的响应 (当实现无法区分 uri-miss 和 vary-miss 时使用).

request: 缓存能够为请求选择新鲜响应, 但请求语义 (例如 Cache-Control 请求指令) 不允许使用它.

stale: 缓存能够为请求选择响应, 但该响应已陈旧.

partial: 缓存能够为请求选择部分响应, 但它不包含所有被请求范围 (或请求针对完整响应).

在可实现范围内, 应当使用缓存已知的最具体原因. 另见 [HTTP-CACHING] 第 4 节.

2.3. fwd-status 参数

fwd-status 的值是 Integer, 指示下一跳服务器响应转发请求时返回的状态码 (见 [HTTP] 第 15 节). fwd-status 参数只有在 fwd 存在时才有意义. 如果 fwd-status 不存在但 fwd 参数存在, 它默认为响应中发送的状态码.

当下一跳服务器针对条件请求发送 304 (Not Modified) 响应, 或由于范围请求发送 206 (Partial Content) 响应时, 此参数有助于区分这些情况.

2.4. ttl 参数

ttl 的值是 Integer, 指示缓存计算出的响应剩余新鲜生命周期 (见 [HTTP-CACHING] 第 4.2.1 节), 以整数秒数表示, 并尽可能接近缓存发送响应头部字段段的时间测量. 这包括缓存通过例如启发式 (见 [HTTP-CACHING] 第 4.2.2 节), 本地配置或其他因素分配的新鲜度. 它可以为负数, 用于指示陈旧.

2.5. stored 参数

stored 的值是 Boolean, 指示缓存是否存储了响应 (见 [HTTP-CACHING] 第 3 节); true 值表示已存储. stored 参数只有在 fwd 存在时才有意义.

2.6. collapsed 参数

collapsed 的值是 Boolean, 指示此请求是否与一个或多个其他转发请求合并 (见 [HTTP-CACHING] 第 4 节). 如果为 true, 响应被成功复用; 如果不是, 则必须发起新请求. 如果不存在, 请求未与其他请求合并. collapsed 参数只有在 fwd 存在时才有意义.

2.7. key 参数

key 的值是 String, 传递用于该响应的缓存键 (见 [HTTP-CACHING] 第 2 节) 的表示. 注意, 这可能是实现特定的.

2.8. detail 参数

detail 的值是 String 或 Token, 允许实现传递其他参数未捕获的附加信息, 例如实现特定状态或其他缓存相关指标.

例如:

Cache-Status: ExampleCache; hit; detail=MEMORY

detail 参数的语义始终特定于发送它的缓存; 即使来自另一个缓存的 details 参数共享相同值, 它也可能不表示同一含义.

此参数有意受到限制. 如果实现的开发者或操作者需要以可互操作方式传递附加信息, 鼓励他们注册扩展参数 (见第 4 节) 或定义另一个头字段.