在設(shè)置GZip時(shí),發(fā)現(xiàn)同時(shí)有個(gè)Deflate壓縮設(shè)置,一開(kāi)始并不了解Deflate壓縮,于是便在啟用GZip的同時(shí),也啟用了Deflate壓縮。雖然同時(shí)設(shè)置GZip和Deflate壓縮,并不影響網(wǎng)站的正常運(yùn)行,并且在檢測(cè)網(wǎng)站是否啟用GZip時(shí),返回的答案是已啟用。但是我們能否不設(shè)置Deflate壓縮呢?或者來(lái)說(shuō),需要禁用Deflate壓縮呢?Deflate壓縮又有什么好處和壞處?帶著這一堆疑問(wèn),我今天查了一些資料,大概了解了一些,最后得到的結(jié)論是:DEFLATE——過(guò)時(shí)的網(wǎng)頁(yè)壓縮格式,最好禁用。
了解GZip和deflate
GZIP,好像是一個(gè)不透明的或原子的功能。事實(shí)上,HTTP定義了一種機(jī)制,一個(gè)Web客戶機(jī)和Web服務(wù)器同意一壓縮方案可以用來(lái)發(fā)送內(nèi)容,這由使用Accept-Encoding和Content-Encoding標(biāo)頭完成。有兩種常用的HTTP壓縮:DEFLATE和GZIP。
DEFLATE是一個(gè)無(wú)專利的壓縮算法,它可以實(shí)現(xiàn)無(wú)損數(shù)據(jù)壓縮,有眾多開(kāi)源的實(shí)現(xiàn)算法。該標(biāo)準(zhǔn)的實(shí)施庫(kù)大多數(shù)人用的是zlib的。zlib庫(kù)提供用于壓縮和解壓縮使用DEFLATE/INFLATE的數(shù)據(jù)。zlib庫(kù)還提供了一種數(shù)據(jù)格式,混淆的命名ZLIB,它包裝DEFLATE壓縮數(shù)據(jù),具有報(bào)頭和校驗(yàn)和。
GZIP是使用DEFLATE進(jìn)行壓縮數(shù)據(jù)的另一個(gè)壓縮庫(kù)。事實(shí)上,GZIP的大多數(shù)實(shí)現(xiàn)實(shí)際使用zlib庫(kù)的內(nèi)部進(jìn)行DEFLATE/ INFLATE壓縮操作。GZIP產(chǎn)生其自己的數(shù)據(jù)格式,混淆的命名GZIP,它包裝DEFLATE壓縮數(shù)據(jù),具有報(bào)頭和校驗(yàn)和。
早期瀏覽器對(duì)DEFLATE壓縮描述混亂
HTTP/1.1 RFC(超文本傳輸協(xié)議HTTP/1.1版)在為Accept-Encoding和Content-Encoding標(biāo)頭描述允許的壓縮方案時(shí)做得不好,它定義了Content-Encoding:gzip,該響應(yīng)體由使用GZIP數(shù)據(jù)格式(GZIP標(biāo)頭,壓縮數(shù)據(jù),和校驗(yàn)和)組成。它還定義 Content-Encoding:DEFLATE,但是,盡管它的名字,這并不意味著響應(yīng)體是DEFLATE壓縮數(shù)據(jù)的原始?jí)K。根據(jù)RFC-2616,DEFLATE和Content-Encoding:DEFLATE,實(shí)際上意味著響應(yīng)體是由zlib的格式(zlib的頭,壓縮數(shù)據(jù)和校驗(yàn))組成的。
這種“DEFLATE的標(biāo)識(shí)并不意味著原始DEFLATE壓縮數(shù)據(jù)”的想法是相當(dāng)混亂的。早期版本的Microsoft的IIS Web服務(wù)器被編程為返回原始DEFLATE壓縮數(shù)據(jù)的Accept-Encoding::deflate要求,而不是一個(gè)zlib的格式的響應(yīng)。而在與Content-Encoding時(shí)期望的響應(yīng)自然版本的Internet Explorer:DEFLATE標(biāo)頭有原始DEFLATE響應(yīng)主體。
Mark Adler,zlib的作者之一,介紹說(shuō):
早期的微軟服務(wù)器會(huì)錯(cuò)誤地提供“Deflate”的原始?jí)嚎s(例如RFC1951的數(shù)據(jù)沒(méi)有RFC1950的zlib包裝)。這導(dǎo)致的問(wèn)題是,瀏覽器不得不去試一下兩種方式,在最后它只是使用更可靠的GZIP。
現(xiàn)在瀏覽器對(duì)DEFLATE壓縮處理不好
如Mark所說(shuō),瀏覽器收到Content-Encoding后,壓縮必須處理兩種可能的情況:響應(yīng)主體是原始DEFLATE數(shù)據(jù),或響應(yīng)主體是zlib包裝過(guò)的DEFLATE響應(yīng)。那么,現(xiàn)代瀏覽器處理DEFLATE或zlib包裝過(guò)的DEFLATE響應(yīng)效果有多好?Verve工作室測(cè)試了一個(gè)龐大的瀏覽器數(shù)量,結(jié)果并不好。
表中的部分結(jié)果意味著瀏覽器處理原始DEFLATE或zlib包裝過(guò)的DEFLATE不一致,這其實(shí)是另一種說(shuō)法“它被破壞了,功能不正常了。”這似乎是一個(gè)棘手的錯(cuò)誤,而瀏覽器創(chuàng)造者不斷重新引入到他們的產(chǎn)品中。 Safari瀏覽器5.0.2?沒(méi)問(wèn)題。 Safari瀏覽器5.0.3?徹底失敗。 Safari瀏覽器5.0.4?沒(méi)問(wèn)題。 Safari瀏覽器5.0.5?不一致和被破壞。
發(fā)送原始DEFLATE數(shù)據(jù)不是一個(gè)好主意,正如馬克說(shuō),“[它]只使用更可靠的GZIP。”
還應(yīng)該注意的是,所有支持DEFLATE的瀏覽器都支持GZIP,但不是所有支持GZip的瀏覽器都支持DEFLATE。有些瀏覽器,如Android,在它們的Accept-Encoding請(qǐng)求頭不包含deflate壓縮。由于你不得不配置你的Web服務(wù)器使用GZIP,你還不如避免Content-Encoding: deflate。
禁用DEFLATE
幸運(yùn)的是,避免DEFLATE并不那么困難。
Apache處理所有HTTP壓縮的模塊是mod_deflate模塊。盡管它的名字,mod_deflate模塊根本不支持deflate。要得到一個(gè)發(fā)送原始DEFLATE或zlib包裝過(guò)的DEFLATE的Apache2版本是不可能。 Nginx的,如Apache,不支持deflate的,它只會(huì)發(fā)送gzip壓縮的響應(yīng),發(fā)送Accept-Encoding:deflate請(qǐng)求頭將導(dǎo)致未壓縮的響應(yīng)。
微軟的IIS Web服務(wù)器可以同時(shí)發(fā)送gzip和deflate的響應(yīng),你可以分別啟用或禁用每個(gè)方案。對(duì)于IIS6,你可以編輯metabase來(lái)禁用DEFLATE支持。對(duì)于IIS7,您可以通過(guò)編輯.config 文件里的 <httpCompression>元素的<schemes>的DEFLATE壓縮方案部分禁用DEFLATE。
如果你的Web服務(wù)器發(fā)送壓縮的DEFLATE內(nèi)容,無(wú)論免費(fèi)還是商業(yè)的產(chǎn)品都具有內(nèi)置的檢測(cè),“過(guò)時(shí)的壓縮格式”。
檢測(cè)網(wǎng)頁(yè)使用GZip還是deflate壓縮
檢測(cè)網(wǎng)頁(yè)使用使用GZip還是deflate壓縮,可以借助一些在線工具,例如卡卡網(wǎng)的GZip壓縮檢測(cè)(http://pagespeed.webkaka.com/youhua/gzip/)。
GZip壓縮檢測(cè)
需要特別注意的是,GZip壓縮是按文件分別壓縮的,并不是檢測(cè)到網(wǎng)頁(yè)啟用了GZip,所有文件就全部啟用GZip了。很多情況下,網(wǎng)頁(yè)啟用了GZip,但發(fā)現(xiàn)JS文件并沒(méi)有啟用GZip,這是因?yàn)樵O(shè)置不當(dāng)而造成的。
如何知道網(wǎng)頁(yè)的哪些文件啟用了GZip,哪些文件還沒(méi)有啟用GZip?可以借助卡卡網(wǎng)的網(wǎng)站速度診斷工具(http://pagespeed.webkaka.com/),一鍵查看。例如,看看下面的檢測(cè)結(jié)果:
html網(wǎng)頁(yè)已經(jīng)成功啟用了GZip壓縮
css文件未成功啟用GZip壓縮
這是因?yàn)?,啟用GZip壓縮時(shí)只對(duì)html網(wǎng)頁(yè)有效,而對(duì)其他文件如css沒(méi)有生效。
您可能對(duì)如下文章也感興趣
IIS啟用GZIP壓縮css、js無(wú)效的原因及解決方法
IIS啟用GZip失敗之原因:臨時(shí)目錄權(quán)限沒(méi)設(shè)好
gzip壓縮啟動(dòng)后js css不能運(yùn)行的解決方法