GZIP壓縮其實就是將網頁內容壓縮,減少HTML代碼網路傳輸的代價,來提高Web效能。
這個請求的過程解釋一下:
1:用戶端Request請求。Http_header中會根據相應的瀏覽器發送相應的編碼規則,
這表明“我”用戶端瀏覽器可以支援gzip、deflate兩種壓縮格式。
2:伺服器端接受到這個“Accept-Encodeing”,伺服器就可以採用相應的gizp、defalte,壓縮web內容,並Response。
3:用戶端瀏覽器接受到相應壓縮後的內容,根據"Content-Encoding:gzip",進行相應解壓縮,並呈現給使用者。
IIS6.0啟用GZIP壓縮的方法
- 開啟Internet資訊服務(IIS)管理器,右擊"網站"->"屬性",選擇"服務"。在"HTTP壓縮"框中選中"壓縮應用程式檔案"和"壓縮靜態檔案",按需要設定"臨時目錄"和"臨時目錄的最大限制";
- 在Internet 資訊服務(IIS)管理器,右擊"Web服務擴充"->"增加一個新的Web服務擴充...",在"建立Web服務擴充"框中輸入副檔名"HTTP Compression",添加"要求的檔案"為C:\WINDOWS\system32\inetsrv\gzip.dll,其中Windows系統目錄根據您的安裝可能有所不同,選中"設定擴充狀態為允許";
- 使用文字編輯器開啟C:\Windows\System32 \inetsrv\MetaBase.xml(建議先備份),找到Location ="/LM/W3SVC/Filters/Compression/gzip",如果需要壓縮動態檔案,則將 HcDoDynamicCompression設定為"TRUE",並在HcScriptFileExtensions中增加您要壓縮的動態檔案尾碼名,如aspx;如果需要壓縮靜態檔案,則將HcDoStaticCompression和HcDoOnDemandCompression設定為 "TRUE",並在HcFileExtensions中增加您需要壓縮的靜態檔案尾碼名,如xml、css等; HcDynamicCompressionLevel和HcOnDemandCompLevel表示需要的壓縮率,數字越小壓縮率越低;
- 編輯完畢後儲存MetaBase.xml檔案;如果檔案無法儲存,則可能IIS正在使用該檔案。開啟"開始"->"管理工具"->"服務",停止"IIS Admin Service"後,即可儲存;
- 最後,重新啟動IIS。可以到HTTP壓縮測試網站驗證結果。
這裡要提到的是:IIS6.0的壓縮,會對HTML、CSS等靜態檔案進行最佳化。IIS6.0會將這些壓縮好的檔案放在一個緩衝目錄中,如果沒有修改,IIS6.0將直接返回緩衝目錄中的檔案。而不是對這些檔案每次都壓縮。
通過HttpModules啟用GZIP壓縮(.NET 2.0)
主要是.NET 2.0有兩個類:GZipStream DeflateStream。Module的代碼粘貼如下(非原創)
public sealed class CompressionModule : IHttpModule
{
void IHttpModule.Dispose()
{
// Nothing to dispose;
}
void IHttpModule.Init(HttpApplication context)
{
if (BlogSettings.Instance.EnableHttpCompression)
{
context.PreRequestHandlerExecute += new EventHandler(context_PostReleaseRequestState);
}
}
private const string GZIP = "gzip";
private const string DEFLATE = "deflate";
void context_PostReleaseRequestState(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
if (app.Context.CurrentHandler is System.Web.UI.Page && app.Request["HTTP_X_MICROSOFTAJAX"] == null)
{
if (IsEncodingAccepted(DEFLATE))
{
app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
SetEncoding(DEFLATE);
}
else if (IsEncodingAccepted(GZIP))
{
app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
SetEncoding(GZIP);
}
}
else if (app.Context.Request.Path.Contains("WebResource.axd"))
{
app.Context.Response.Cache.SetExpires(DateTime.Now.AddDays(30));//是.NET自己的檔案,這裡只是加緩衝時間
}
}
private static bool IsEncodingAccepted(string encoding)
{
HttpContext context = HttpContext.Current;
return context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains(encoding);
}
private static void SetEncoding(string encoding)
{
HttpContext.Current.Response.AppendHeader("Content-encoding", encoding);
}
}
什麼類型檔案應該GZIP壓縮:
1:CSS,Javascript、html 靜態檔案
2:asp,aspx 動態檔案
圖片不要使用GZIP,壓縮了反而大(忘記是那篇文章提到了)
如何檢查網頁是否GZIP壓縮過:
1:Fiddler 軟體(我中使用的軟體),查看Content-Encoding
2:http://www.port80software.com/tools/compresscheck.asp 網站
3:自己寫一個Post,添加“Accept-Encodeing:gzip”,看返回的內容就知道啦
改進:
目前我們的網站aspx頁面已經啟用Gzip壓縮,但CSS,Javascript,html還沒使用。而且最好使用IIS6.0配置方式的壓縮(IIS6.0有壓縮緩衝)。
請教:
1:GZIP,Deflate 兩種有什麼區別
2:從HtmpModule代碼來看,應該是優先使用Defalte,那麼是不是如果 GZIP,Deflate同時存在優先使用Deflate。但在網站的測試中發現,Defalte壓縮比GZIP大?
參考文檔:
dudu http://www.cnblogs.com/dudu/archive/2004/12/12/76085.html
http://www.yaosansi.com/post/957.html
--=閱讀快樂=--
Google 標記: Web效能最佳化, GZIP