Apache2 / Nginx 啟用壓縮(gzip) 於 IE6 的問題說明

網站只要能啟用 gzip 壓縮, 都能節省非常多的流量, 下述幾種與對應壓縮方式名稱對應:

  • apache1.x: mod_gzip
  • apache2.x: deflate (啟用方式: a2enmod deflate)
  • nginx: gzip

只是壓縮啟用後, 在 IE6 會有一些問題, 有時候會出現空白頁 / JS 沒載入完.. 等等異常現象.

先講結論:

  1. IE6 (含 IE6 以前的版本)不支援 "Transfer-Encoding: chunked", 所以會有問題.
  2. 解法就是, IE6 以前的不使用 gzip 壓縮, 或者找已經有解決此問題的 Web server 來用

Apache2 / Nginx 啟用壓縮(gzip) 於 IE6 的問題說明

IE6 以前會發生異常現象, 主要的原因下述此篇文章有解釋: IE6 不支持 HTTP 協議的動態壓縮 Chunked 方式, 下述摘錄自此篇:

通常, HTTP 協議中 使用 Content-Length 這個 HEADER 來告知數據的長度. 然後, 在數據下載的過程中, Content-Length 的方式要預先在 Web Server 中暫存所有資料, 然後所有資料再一起發給客戶端.

如果要一邊產生資料, 一邊發給客戶端, WEB Server 就需要使用 "Transfer-Encoding: chunked" 這樣的方式來代替 Content-Length.

HTTP 溝通格式如下:

HTTP HEADER\r\n\r\n
16進制(資料長度)\r\n
上面所指的資料長度內容...\r\n
16進制代表的第二段資料\r\n
XX 長度的資料...\r\n
... 反覆這樣子傳輸.
0\r\n\r\n(0 代表資料結束, 在加上兩次換行)

發生異常現象的原因, 就是在於 IE6 不支持 chunked 方式(Transfer-Encoding: chunked)的動態壓縮, 所以只能放棄對 IE6 的壓縮.

取消 IE6 的壓縮設定

Nginx 的設定如下:

gzip_disable "MSIE [1-6]\.(?!.*SV1)";

Apache2 "/etc/apache2/mods-available/deflate.conf" 裡面本身有寫到下述:

# these are known to be safe with MSIE 6
AddOutputFilterByType DEFLATE text/html text/plain text/xml

# everything else may cause problems with MSIE 6
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
AddOutputFilterByType DEFLATE application/rss+xml

就自己決定要怎麼做囉~

不支援 chunked 的解法

Yahoo! 有把這個問題解決掉(有些 CDN 有把這個問題解決掉), 使用有解決掉這些問題的 Server 來吐資料的話, Gzip 就可以安心開啟使用.

Yahoo! 的解法在此篇有解說 並有 PHP code 的測試範例: HTTP chunked + gzip 及 瀏覽器間容測試

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料