`
hax
  • 浏览: 961320 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IE与Vary头

    博客分类:
  • MISC
阅读更多
这两天写Jedi时涉及到一个小问题。Jedi的可能特性之一是可为不同的UA自动输出不同的HTML/CSS等(比如当遇到html5新标签,对IE6~8输出带namespace的xml标签)。

但是如果不考虑一开始就根据UA来redirect到不同的URL,那么就意味着get同一个URL会产生不同的response,这会影响cache机制。

熟悉HTTP协议的同学可能很快想到可以发出Vary头。不过印象中Vary似乎得到支持有不少问题,因此特别去google了一下。果然,找到一篇IE团队的人写的blog:Vary with Care

根据该文,IE背后的WinINET引擎压根不保存请求头,也就是说IE(以及所有用WinINET的应用)只能根据URL得到Cache,根本无法支持Vary——Vary的本质是根据“URL + 指定的headers”得到Cache。

那么IE如果看到带有Vary头的response,会怎样?它就会认为该response是不可缓存的!也就是发Vary头就会导致IE的client cache失效。

不过还有一点点特别处理。

第一,IE会认 Vary: User-Agent 。

所以说IE团队还是有聪明人的。因为对于一个浏览器来说UA总是永远一样的(废话嘛),所以不存在不同的cache的可能。尽管我个人怀疑这是否导致其他问题,比如是否影响其他用WinINET的应用(因为按理说它们的UA并不是IE嘛)——不过先不担心这些了,反正这真是好消息,因为回到我的最初需求,就是针对不同的UA输出不同的内容。所以我确实可以通过Vary: User-Agent来保证Cache的正确。不过问题是,如果还有其他Vary因素呢?

第二,对于压缩过的响应,IE6在解码后会抛弃整个Vary头——这真是一个毫无道理的做法,唯一的解释是程序员认为Vary只有一个可能是Vary: Accept-Encoding。IE7开始则只去掉Accept-Encoding头。看上去这比IE6正常了点,不过其实不管IE6还是IE7都有极大问题——那就是IE只针对压缩响应扔掉AE头,如果是未压缩响应则不会。

这其实说明IE程序员没搞懂Vary: Accept-Encoding的用法。实际上Server对于某个URL只要支持压缩,就应该总是输出Vary:AE,即使该响应并没有压缩(比如对于不支持解压的client发送的响应)。因为如果不输出Vary:AE的话,可能导致链路上的Proxy看到一次未压缩的响应,就只cache该响应(因为没有Vary头告诉Proxy实际上我还支持压缩版本)。而那些支持解压的client就无法得到压缩的好处了。

然而如果IE收到一个未经压缩但是也带有Vary:AE的响应,Vary:AE头不会被干掉,那么会怎样?就会回到我们最初那个情况,导致Cache失效!我勒个去!于是IE6会很坑爹的重发请求,而IE7稍微聪明点,如果有ETag的话,会发If-Modified-Since,那么至少可能拿个304回来。

一直到IE9,才有比较正常的做法:IE9会忽略Vary中的以下内容及其任意组合:Accept-Encoding、User-Agent、Host(本来在Vary中写Host就是比较蛋疼的事情,因为不同host的请求肯定是vary的,但真这么写了,你也不要跟写的人一样智商嘛,所以IE9的智商确实提高了)。


总结一下:

为了确保IE6~8不至于客户端cache完全失效,可用 Vary: User-Agent, Accept-Encoding 并开启压缩。

对于IE6,在解压后整个Vary头被丢弃,就OK。
对于IE7和8,解压后AE被去掉,剩下的UA则会被忽略。

如果有其他的Vary需求,可用不同的URL,比如Vary:Accept就用*.html、*.json之类,而Vary:Accept-Language就用*.en、*.zh之类的。这就是Apache的content negoation模块做的事情。

最后对于不压缩的(比如以压缩传输的脚本,在没打过patch的IE6上会有问题),不能加AE,否则会导致IE的cache失效。但为了保证Proxy不被未加AE的响应导致只缓存未压缩版本,可为此响应加上Cache-control: private。


注:以上是根据前述blog和相关comments做出的结论。更多的问题也许需要实测。


以上。




0
4
分享到:
评论

相关推荐

    IE9新特性概览

    超长存活期的缓存头、Vary改进、重定向缓存等技术的应用,使得IE9在请求计数、发送字节和接收字节上均实现了显著下降,从而进一步提升了浏览器的响应速度和整体性能。 #### 结语 综上所述,IE9通过一系列的技术...

    浅析易语言web服务器html协议头

    * 兼容性强:易语言web服务器html协议头可以支持大部分主流浏览器,例如QQ浏览器、360浏览器、百度浏览器、2345浏览器、IE浏览器等。 易语言web服务器html协议头是一个非常重要的web开发技术,广泛应用于各种web...

    怎样取消ASP.NET页面的缓存

    2. 使用Vary头:如果你的页面内容根据用户的不同而变化,可以设置`Vary`头来告诉浏览器不同的用户需要不同的缓存副本。 ```csharp Context.Response.AppendHeader("Vary", "*"); ``` 3. 使用Cache-Control头:更...

    Nginx如果基于gzip压缩提高访问速度

    如果设置为on,那么在响应头中会包含"Vary: Accept-Encoding",这样可以让代理服务器缓存两种版本的内容,一种是压缩过的,一种是没有压缩过的。 3. gzip_proxied any;:当Nginx作为反向代理时,该指令用来控制是否...

    Nginx基础入门之gzip配置指南

    `发送Vary头,通知客户端服务器根据Accept-Encoding头来决定是否压缩内容,有助于缓存代理。 9. **定义压缩类型**:`gzip_types`指令指定哪些MIME类型应该被压缩,包括常见的文本和脚本类型。例如,`gzip_types ...

    Nginx开启Gzip压缩大幅提高页面加载速度的方法

    ` 这个指令用于在HTTP响应头中添加或不添加“Vary: Accept-Encoding”头部。如果开启,告诉客户端服务器支持内容编码,使得缓存服务器(如Squid)能够根据接受到的内容编码存储多个版本的缓存内容。如果不需要这个...

    详解Nginx服务器的配置中开启文件Gzip压缩的方法

    8. `gzip_disable "MSIE [1-6]\."`:禁用对IE6及更低版本的支持,因为这些版本的浏览器对Gzip支持不佳。 此外,`gzip_proxied`指令用于控制Nginx作为反向代理时如何处理后端服务器的响应。不同的参数值表示在特定...

    Nginx启用gzip压缩的方法示例

    `:设置是否在HTTP响应头中添加`Vary: Accept-Encoding`,这样可以提示下游缓存服务器根据客户端的Accept-Encoding头来处理响应。 6. `gzip_disable "MSIE [1-6]\.";`:禁用对IE6及更低版本的gzip压缩,因为这些...

    nginx配置gzip压缩页面

    7. `gzip_vary on`: 添加`Vary`头部信息,这样代理服务器可以根据客户端的HTTP头来决定是否需要进行压缩,防止对不支持gzip的浏览器进行不必要的压缩。 8. `gzip_disable "MSIE [1-6]\."`: 这个指令用于禁用对旧版...

    Nginx服务器实现数据静态压缩的方法

    - `gzip_disable`:对特定浏览器或版本禁用Gzip压缩,例如“MSIE [1-6]\.”针对的是IE6及以下版本的IE浏览器。 - `gzip_vary on;`:为压缩响应添加"Vary: Accept-Encoding"头部,这有助于代理服务器正确处理压缩内容...

    Nginx服务器中使用gzip压缩的相关配置解析

    `:开启此选项,Nginx会在响应头中添加“Vary: Accept-Encoding”,告诉下游代理服务器或缓存服务器内容可能经过了gzip压缩。 4. `gzip_comp_level 6;`:设置gzip压缩级别,范围从1到9。级别越高,压缩效果越好,但...

    apache启用gzip压缩的实现方法

    **兼容性**:当前主流浏览器(如IE、Firefox、Chrome、Opera)均支持Gzip压缩,因此启用Gzip不会对大部分用户造成问题。但为了确保兼容性,可通过检查`Accept-Encoding`头来判断浏览器是否支持Gzip。 **性能优化**...

    Nginx服务器中的GZip配置参数详解

    7. `gzip_vary on`: 开启`Vary: Accept-Encoding`头部,告诉客户端服务器支持GZip压缩。这有助于缓存代理和CDN服务正确处理压缩内容。 8. `gzip_proxied`: 当Nginx作为反向代理时,这个参数决定是否对代理的响应...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览器将获得Chrome的性能和功能 目录 摘要 I ABSTRACT II 专业名词清单 III 第一章 绪论 1 1.1 研究背景与意义 1 1.2国内外相关...

    ICS delphixe10源码版

    ICS - Internet Component Suite - V8 - Delphi 7 to RAD Studio 10 Seattle ======================================================================= (Aka FPIETTE's Components) Revised: March 3, 2016 ...

    英语四级词汇

    本篇文章将基于一份四级词汇表中的部分单词进行详细的解释与分析,帮助考生更好地理解这些词汇,并能够灵活运用到实际语言环境中。 #### 二、高频词汇解析 1. **alter** [ˈɔːltə(r)] - v. 改变,改动,变更 ...

    王小平版遗传算法的光盘源代码

    王小平版遗传算法的光盘源代码 SGPC: Simple Genetic Programming in C by Walter Alden Tackett and Aviram Carmi ... Version 1.1 (c) 1993 by Walter Alden Tackett and Aviram Carmi ...This code and ...

    浙江高考英语--600高频词汇.doc

    - **例句**:Weather patterns can vary greatly from one region to another. - **应用场景**:适用于气象预报、市场调研或科学研究等。 #### 30. vanish /ˈvænɪʃ/ vi. 消灭,不见 - **含义**:迅速消失或变得...

Global site tag (gtag.js) - Google Analytics