“Vary:Accept”HTTP标头的功能是什么?

时间:2009-12-29 16:15:10

标签: http caching proxy

我使用PHP生成动态网页。如下面的教程所述(参见下面的链接),当$ _SERVER ['HTTP_ACCEPT']允许时,XHTML文档的MIME类型应为“application / xhtml + xml”。由于您可以使用2个不同的MIME(“application / xhtml + xml”和“text / html”)提供相同的页面,因此您应该将“Vary”HTTP标头设置为“Accept”。这将有助于代理上的缓存。

链接: http://keystonewebsites.com/articles/mime_type.php

现在我不确定以下含义: 标题('变化:接受'); 我不太确定'Vary:Accept'会做什么......

我找到的唯一解释是:

  

在Content-Type标题之后,变化了   标头被发送到(如果我理解的话   正确地告诉中间缓存,   像代理服务器那样的内容   文件类型因人而异   关于客户的能力   请求文件。   http://www.456bereastreet.com/archive/200408/content_negotiation/

任何人都可以向我提供此标题的“真实”解释(具有该值)。我想我理解的事情如下: 变化:接受编码 代理上的缓存可以基于所服务页面的编码,但我不明白: 变化:接受

3 个答案:

答案 0 :(得分:93)

  • cache-control标头是HTTP服务器告诉缓存代理响应“新鲜度”的主要机制。 (即,如何/如果长时间将响应存储在缓存中)

  • 在某些情况下,cache-control指令不足。来自HTTP工作组的讨论归档here,,描述仅使用语言进行更改的页面。这是变量标题的正确用例,但上下文对我们的讨论很有价值。 (虽然我相信Vary标题会在这种情况下解决问题,但有更好的方法。)从该页面开始:

  

Vary严格适用于代理复制服务器所做的无望或过于复杂的情况。

一个人为的例子:

您的HTTP服务器具有较大的目标网页。您有两个略有不同的页面具有相同的URL,具体取决于用户以前是否在那里。您可以根据Cookie区分请求和用户的“访问次数”。但是 - 由于您的服务器的登录页面太大,您希望中​​间代理在可能的情况下缓存响应。

URL,Last-Modified和Cache-Control标头不足以向缓存代理提供此洞察,但如果添加Vary: Cookie,缓存引擎会将Cookie标头添加到其缓存决策中。

最后,对于流量较小的动态网站,我总是发现简单Cache-Control: no-cache, no-storePragma: no-cache已足够。

编辑 - 更准确地回答您的问题:HTTP请求标头“接受”定义客户端可以处理的内容类型。如果您在同一网址上有两份相同内容的副本,但仅在内容类型方面有所不同,那么使用Vary: Accept可能是合适的。

9月12日更新:

自从此评论最初发布以来,我在评论中添加了一些链接。对于Vary:Accept,它们都是真实世界范例(和问题)的优秀资源。如果你正在阅读这个答案,你也需要阅读这些链接。

第一个来自杰出的EricLaw,介绍了Internet Explorer对Vary标题的行为以及它给开发人员带来的一些挑战:Vary Header Prevents Caching in IE。简而言之,IE(IE9之前版本)不会缓存使用Vary标头的任何内容,因为请求缓存不包含HTTP请求标头。 EricLaw(Eric Lawrence在现实世界中)是IE团队的项目经理。

第二个来自Eran Medan,并且正在讨论Chrome中与Vary相关的意外行为:Backing doesn't handle Vary header correctly。它与IE的行为有关,除了Chrome开发者采取了不同的方法 - 尽管它似乎并不是一个慎重的选择。

答案 1 :(得分:55)

Vary: Accept只是说响应是根据请求中的Accept标头生成的。具有不同Accept标头的请求可能会得到不同的响应。

(您可以看到链接的PHP代码查看$HTTP_ACCEPT。这是Accept请求标头的值。)

对于HTTP缓存,这意味着必须特别小心缓存响应。只有与以后的请求完全相同的Accept标题才能有效匹配。

现在这只在页面可以缓存的情况下才有意义。默认情况下,PHP页面不是。 PHP页面可以通过发送某些标头(例如Expires)将输出标记为可缓存。但是否以及如何做到这一点是一个不同的问题。

答案 2 :(得分:1)

这个google webmaster video对HTTP Vary标题有很好的解释。