emu in blogjava

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評(píng)論 :: 2 Trackbacks

          http://www.aygfsteel.com/emu/archive/2011/02/27/345262.html
            
                這個(gè)問(wèn)題不是太廣為人知,但也算不上新鮮知識(shí)了,IE6如果接收到一個(gè)gzip壓縮的http響應(yīng),那么這個(gè)響應(yīng)中的Etag信息會(huì)被拋棄,此時(shí)只能依賴(lài)last-modified時(shí)間來(lái)設(shè)計(jì)cache策略。某些類(lèi)型的Vary值據(jù)說(shuō)也會(huì)導(dǎo)致相同的問(wèn)題。
                  為了這個(gè)問(wèn)題emu在http頭上動(dòng)了n多手術(shù),甚至把200響應(yīng)狀態(tài)硬生生換成206等狀態(tài),IE6一直都非常頑固的不肯吐出If-None-Match信息。幾乎要放棄了。
                  丟開(kāi)這個(gè)bug,我們來(lái)看問(wèn)題的實(shí)質(zhì)是什么。實(shí)質(zhì)是,我們有一個(gè)叫做Etag的,響應(yīng)內(nèi)容的一個(gè)hash值,需要在響應(yīng)的時(shí)候從服務(wù)器送給瀏覽器,并且要求在瀏覽器下次請(qǐng)求同一個(gè)路徑的時(shí)候把這個(gè)hash值送回給服務(wù)器校驗(yàn)。http中規(guī)定了,我們可以在http header內(nèi)容中通過(guò)一個(gè)叫做Etag的header來(lái)做這個(gè)事,但是現(xiàn)在瀏覽器不給力啊,有啥別的手段可以做相同的事情呢?

                  答案一點(diǎn)也不難想,我們一天到晚在實(shí)現(xiàn)“把一個(gè)值從服務(wù)器送給瀏覽器,并讓瀏覽器吧它送回服務(wù)器”這件事的時(shí)候都是用什么手段的呢?沒(méi)錯(cuò)啦,就是cookie。而且cookie還支持path!
                  因此需要做的事情就是,server在發(fā)現(xiàn)User-Agent是IE6的時(shí)候,在返回gzip內(nèi)容的時(shí)候出了要送Last-Modified時(shí)間之外,不要送Etag頭了,改為返回一個(gè)set-cookie頭:
                  Set-Cookie: etag=hash; pagh=/mypath
                  服務(wù)器在下次收到請(qǐng)求的時(shí)候,如果收到了If-Modified-Since信息,表明客戶(hù)端有一份當(dāng)前請(qǐng)求的cache,就可以從cookie里面驗(yàn)證etag值來(lái)決定是否返回304拉!
          posted on 2011-02-27 00:37 emu 閱讀(3462) 評(píng)論(8)  編輯  收藏

          評(píng)論

          # re: IE6上Gzip+Etag問(wèn)題的解決方案[未登錄](méi) 2011-03-02 22:35 ryan
          If-Modified-Since不就已經(jīng)可以判斷這個(gè)請(qǐng)求是否需要下發(fā)304還是原本的文件的么?

          為什么還需要額外的模擬etag的工作方式呢?  回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案 2011-03-14 14:09 煤矸石粉碎機(jī)
          不錯(cuò),過(guò)來(lái)學(xué)習(xí)了  回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案 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.
          有不同的應(yīng)用場(chǎng)景的。
            回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案[未登錄](méi) 2011-04-02 10:06 小海
          簡(jiǎn)單明了,樓主寫(xiě)得很好哈~~~  回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案 2011-05-04 11:10 http://ask.zhongguoren.me
          感謝`~~來(lái)學(xué)習(xí)了~~  回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案 2011-05-04 11:13 移動(dòng)破碎站
          寫(xiě)的不錯(cuò),還是我朋友介紹我來(lái)看的·  回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案[未登錄](méi) 2011-05-08 18:00 1
          寫(xiě)的很好. http://www.7004054.com 期待您的回訪.  回復(fù)  更多評(píng)論
            

          # re: IE6上Gzip+Etag問(wèn)題的解決方案[未登錄](méi) 2012-02-05 10:55 ryan
          @emu

          etag字符串的最后一部分整合了機(jī)器信息,
          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.

          但這個(gè)在CDN部署上,恰恰是最不適宜帶上的。 所以如果要保證來(lái)自統(tǒng)一服務(wù)器,那么Etag建議帶上,如果CDN多地域機(jī)器部署,這個(gè)Etag就不合適了,至少要把機(jī)器信息干掉,所以直接用If-Modified-Since 更為合適吧  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 嵊州市| 泸州市| 禹州市| 策勒县| 威远县| 泰顺县| 定兴县| 郸城县| 临安市| 新野县| 南乐县| 曲周县| 客服| 巴彦县| 开化县| 崇明县| 巢湖市| 利辛县| 太谷县| 沙雅县| 禹州市| 扬州市| 库伦旗| 贵州省| 梅河口市| 微博| 中山市| 壶关县| 衡南县| 伊金霍洛旗| 香港 | 巴林右旗| 榕江县| 武夷山市| 四平市| 绥德县| 缙云县| 淮滨县| 香格里拉县| 汉寿县| 民权县|