emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  170 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks

http://www.blogjava.net/emu/archive/2011/02/27/345262.html
  
      这个问题不是太广为人知,但也算不上新鲜知识了,IE6如果接收到一个gzip压缩的http响应,那么这个响应中的Etag信息会被抛弃,此时只能依赖last-modified时间来设计cache策略。某些类型的Vary值据说也会导致相同的问题。
        为了这个问题emu在http头上动了n多手术,甚至把200响应状态硬生生换成206等状态,IE6一直都非常顽固的不肯吐出If-None-Match信息。几乎要放弃了。
        丢开这个bug,我们来看问题的实质是什么。实质是,我们有一个叫做Etag的,响应内容的一个hash值,需要在响应的时候从服务器送给浏览器,并且要求在浏览器下次请求同一个路径的时候把这个hash值送回给服务器校验。http中规定了,我们可以在http header内容中通过一个叫做Etag的header来做这个事,但是现在浏览器不给力啊,有啥别的手段可以做相同的事情呢?

        答案一点也不难想,我们一天到晚在实现“把一个值从服务器送给浏览器,并让浏览器吧它送回服务器”这件事的时候都是用什么手段的呢?没错啦,就是cookie。而且cookie还支持path!
        因此需要做的事情就是,server在发现User-Agent是IE6的时候,在返回gzip内容的时候出了要送Last-Modified时间之外,不要送Etag头了,改为返回一个set-cookie头:
        Set-Cookie: etag=hash; pagh=/mypath
        服务器在下次收到请求的时候,如果收到了If-Modified-Since信息,表明客户端有一份当前请求的cache,就可以从cookie里面验证etag值来决定是否返回304拉!
posted on 2011-02-27 00:37 emu 阅读(3047) 评论(8)  编辑  收藏

评论

# re: IE6上Gzip+Etag问题的解决方案[未登录] 2011-03-02 22:35 ryan
If-Modified-Since不就已经可以判断这个请求是否需要下发304还是原本的文件的么?

为什么还需要额外的模拟etag的工作方式呢?  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案 2011-03-14 14:09 煤矸石粉碎机
不错,过来学习了  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案 2011-03-21 10:45 emu
@ryan

http://developer.yahoo.com/performance/rules.html
ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date.
有不同的应用场景的。
  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案[未登录] 2011-04-02 10:06 小海
简单明了,楼主写得很好哈~~~  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案 2011-05-04 11:10 http://ask.zhongguoren.me
感谢`~~来学习了~~  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案 2011-05-04 11:13 移动破碎站
写的不错,还是我朋友介绍我来看的·  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案[未登录] 2011-05-08 18:00 1
写的很好. http://www.7004054.com 期待您的回访.  回复  更多评论
  

# re: IE6上Gzip+Etag问题的解决方案[未登录] 2012-02-05 10:55 ryan
@emu

etag字符串的最后一部分整合了机器信息,
Entity tags (ETags) are a mechanism that web servers and browsers use to determine whether the component in the browser's cache matches the one on the origin server.

但这个在CDN部署上,恰恰是最不适宜带上的。 所以如果要保证来自统一服务器,那么Etag建议带上,如果CDN多地域机器部署,这个Etag就不合适了,至少要把机器信息干掉,所以直接用If-Modified-Since 更为合适吧  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: