我使用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/
任何人都可以向我提供此标题的“真实”解释(具有该值)。我想我理解的事情如下: 变化:接受编码 代理上的缓存可以基于所服务页面的编码,但我不明白: 变化:接受
答案 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-store
和Pragma: 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
标题有很好的解释。