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 状态码) 仍被视为命中, 只要它没有向前转发 (例如用于验证).
已经在缓存中但不向前转发就无法使用的响应 (例如因为它已陈旧或是部分响应) 不被视为命中. 注意, 不向前转发就使用的陈旧响应 (例如因为源服务器不可用) 可以视为命中.
hit 和 fwd 互斥; 每个列表成员上只应出现其中一个.
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 节) 或定义另一个头字段.