網站只要能啟用 gzip 壓縮, 都能節省非常多的流量, 下述幾種與對應壓縮方式名稱對應:
- apache1.x: mod_gzip
- apache2.x: deflate (啟用方式: a2enmod deflate)
- nginx: gzip
只是壓縮啟用後, 在 IE6 會有一些問題, 有時候會出現空白頁 / JS 沒載入完.. 等等異常現象.
先講結論:
- IE6 (含 IE6 以前的版本)不支援 "Transfer-Encoding: chunked", 所以會有問題.
- 解法就是, 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 及 瀏覽器間容測試