HTTP头文件Vary:*的含义是什么?

11
据我所知,HTTP头部字段Vary指定了一个逗号分隔的HTTP头部列表,缓存在决定请求是缓存命中还是缓存未命中时需要将其与URL一起考虑。
如果省略该头部,则表示只考虑URL。
但当头部为Vary:*时会发生什么呢? RFC 2616 14.4

***的Vary字段值表示未指定参数(例如客户端的网络地址)在选择响应表示时起作用。*值不得由代理服务器生成;它只能由源服务器生成。

RFC 2616 13.6

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

这是否意味着所有带有此头部的请求都将成为缓存未命中?
我发现,如果您使用ASP.NET的OutputCacheAttribute,它会返回该HTTP头部,如果您不想要该头部,或者想要指定自定义头部,则必须显式禁用该行为,因此我(希望)认为这是不太可能的。 < p >"Vary:*"的实际意义是什么?

谢谢。

1个回答

8

Vary:* 告诉缓存响应是基于 HTTP 内容协商的通常方面之外的某些方面选择的(例如 Accept、Accept-Language、Accept-Charset)。

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

编辑:Vary 与缓存无关。考虑以下内容:

GET /foo HTTP/1.1

200 Ok Cache-Control: maxage=60 Content-Location: /foo.html Vary: *

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


3
我仍然不理解那个头部的意义。为什么我要使用它而不是no-cache或no-store呢?为什么asp.net会在缓存指令中发送这个头部呢? - vtortola
1
Vary 不仅适用于缓存,它还记录了内容协商的选择过程。如果移除 Vary 并使响应不可公共缓存,那么将隐藏协商发生的事实。这将隐藏请求 URI 标识的协商资源的事实,而这可能对某些中介或客户端很有兴趣。 - Jan Algermissen
嗯...现在有意义了。OutputCacheAttribute只是ASP.NET WebForms缓存API的包装器。ASP.NET WebForms基于POST调用(postbacks),因此响应始终根据POST中的参数而变化,这些参数位于HTTP标头和URL之外。这就是原因。非常感谢,你解决了我的烦恼:D - vtortola
我开始了一个关于Vary的新问题,你能告诉我我说的话是否有意义吗?谢谢:https://dev59.com/tFvUa4cB1Zd3GeqPxtwQ - vtortola
如果在没有Content-Location的情况下传递了Vary:*,这不是原始问题的一部分,会发生什么 - 缓存是否总是未命中?这个答案并没有完全回答原来的问题。 - Chris Moschini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接