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)在瀏覽器不給力啊,有啥別的手段可以做相同的事情呢?
因此需要做的事情就是,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拉!