缓存控制和 Header/Form/Query 参数

Cache control and Header/Form/Query Parameters

我天真地假设,如果我启用 cache-control,并且客户端使用不同的 header 参数值发出 2 个不同的请求,browser/server 将独立地处理这两个请求,而不会任何缓存。

我痛苦地发现事实并非如此。即使请求 header 的参数值发生变化,第一个响应仍会缓存并为第二个请求提供服务。

关于 cache-control 的哪些行为构成 "cache hit",哪些行为构成 "cache miss",是否有明确的清单?

我目前能想到的一些不同的因素:

  1. Query parameter keys
  2. 查询参数值
  3. 表单参数键
  4. 表单参数值
  5. Header 参数键
  6. Header 参数值

根据我的经验,在确定请求是否为 cache-hit 时,数字 6 肯定会被忽略。

根据我所做的一些研究,在确定某物是否 cache-hit 时似乎会评估因素 1 和 2。

其他人呢?

有关规范,请参阅 RFC 7234

特别是:

The primary cache key consists of the request method and target URI.

另请注意:

When presented with a request, a cache MUST NOT reuse a stored response, unless: ... selecting header fields nominated by the stored response (if any) match those presented (see Section 4.1)

还有:

When a cache receives a request that can be satisfied by a stored response that has a Vary header field (Section 7.1.4 of [RFC7231]), it MUST NOT use that response unless all of the selecting header fields nominated by the Vary header field match in both the original request (i.e., that associated with the stored response), and the presented request.

也就是说,除非服务器响应 Vary: 并指定 header.

,否则假定 header 不重要