from:http://niyunjiu.javaeye.com/blog/740812


其實這個Bug是由分兩種情況的:

1.和Nginx無關,是針對CSS背景圖片的。

一般用戶不會碰到,更多的時候是開發者將自己的IE的緩存策略從默認的”自動”改為“每次訪問都查詢”才發生 的。特點是鼠標一旦浮動到有背景圖片的地方,IE會不顧已經緩存的圖片,自行去服務器再次獲取圖片,造成圖片短暫消失。這個問題比較簡單,可以通過以下腳 本解決。

1 <script type=”text/javascript”>// <![CDATA[
2 try {
3 document.execCommand('BackgroundImageCache', false, true);
4 } catch(e) {}
5 // ]]></script>

2. 但是實際上更常見的原因是Nginx上打開了Gzip壓縮功能。

這個是IE6 的著名Bug,早在2002年就被人詳細討論過了,在IE7中有所改進,但微軟永遠也不會去修復IE6了。

根本原因是Nginx對于啟用了Gzip的http上下文,即使你在之前的配置文件里聲明過 gzip_disable “MSIE [1-6].”,Nginx不再對IE6用Gzip壓縮了,但是送出的http報頭卻仍然采用了和Gzip壓縮數據包相匹配的Vary: Accept-Encoding。IE6不認識這個報頭,IE6對除了Vary: User-Agent的報頭外,都不查詢緩存,直接去服務器申請。更絕得是,不是使用查詢文件是否更新,而是強行要求一份完整文件。(IE7總算客氣了 點,就是先查詢一下文件是否更新在下載,減輕了這個bug的影響)。

這個Bug的級別很高,靠前面1中的方法是不行的。在 NGINX中,通過add-header Cache-Control “post-check:3600, pre-check:43200″; ,象這里 介紹的方法, 也是不行的。通過一番痛苦的摸索,才發現要解決這個Bug,有兩個方法,一個是使用Nginx的headers-more-nginx-module, 遇到User-Agent是IE6(或者不管三七二十一),修改報頭為Vary: User-Agent。不過這個模塊并不是標準配置,需要重新編譯Nginx。

另一個更為簡便易行的方式就是在諸如圖片和CSS,JS文件存取的地方加上一下語句,顯示關閉Gzip,并手工加上報頭。

1 if ($http_user_agent ~ “MSIE [1-6].”) {
2 #Must explicitly turns off gzip to prevent Nginx set Vary:Accept-Encoding
3 #which will prevent IE6 from caching anything
4 gzip off;
5 add_header Vary “User-Agent”;
6 }
經過我的測試這樣是可以解決問題的。這里只能用$http_user_agent來獲取瀏覽器參數,曾經試過$ancient_browser,不 過沒有成功。

另外,Nginx本身是有一個Gzip的Derective來控制Header的, 就是gzip_vary。設成gzip_vary off應該也能解決問題,但這是這個參數只能存在與http, location,server這些上下文里,不能添加到if上下文里,所以只能用gzip off; 把gzip完全給關了。