11

据我所知,HTTP 标头Vary指定了一个逗号分隔的 HTTP 标头列表,在决定请求是缓存命中还是未命中时,缓存需要与 URL 一起考虑这些标头。

如果省略该标头,则意味着仅考虑 URL。

但是当标题是时会发生什么Vary:*

RFC 2616 14.4

*** 的 Vary 字段值表示未指定的参数不限于请求标头(例如,客户端的网络地址),在响应表示的选择中起作用。* 值不得由代理服务器生成;它只能由原始服务器生成。

RFC 2616 13.6

*的 Vary 标头字段值始终无法匹配,并且对该资源的后续请求只能由源服务器正确解释。

这是否意味着具有此标头的所有请求都将成为缓存未命中?

我发现如果您使用 ASP.NET 将返回该 HTTP 标头OutputCacheAttribute,并且如果您不想要标头,或者您想要指定自定义标头,则必须明确禁用该行为,所以我(想要)相信它不太可能。

哪个是实际意义Vary:*

谢谢。

4

1 回答 1

7

Vary:* 告诉缓存已根据 HTTP 内容协商的常规方面之外的方面(例如 Accept、Accept-Language、Accept-Charset)选择了响应。

这有效地告诉缓存不要缓存响应。这就是“对该资源的后续请求只能由源服务器正确解释”的含义。缓存必须将这些请求转发到源服务器。

编辑:Vary 与缓存正交。考虑一下:

获取 /foo HTTP/1.1

200 OK 缓存控制:maxage=60 内容位置:/foo.html 变化:*

Vary:* 告诉缓存不能缓存对 /foo 的请求的响应。但是由于 Content-Location 标头,缓存仍然可以存储对 /foo.html 的请求的响应。

于 2011-10-01T15:53:26.890 回答