启用IIS7 gzip压缩

230

如何启用IIS7对静态文件(如JS和CSS)进行gzip压缩,以及如何测试IIS7是否确实在将它们发送到客户端之前进行了gzip压缩?

10个回答

243

配置

您可以在Web.config文件中完全启用GZIP压缩。 如果您使用共享托管并且无法直接配置IIS,或者希望您的配置在所有目标环境之间传递,则特别有用。

<system.webServer>
  <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
</system.webServer>

测试

为了测试压缩是否有效,使用Chrome浏览器中的开发工具或Firefox浏览器中的 Firebug插件并确保HTTP响应头已设置:

Content-Encoding: gzip

注意,如果响应代码为304(未修改),则该标头将不存在。如果是这种情况,请进行全面刷新(按住Shift或Control键,同时单击刷新按钮),然后再次检查。


21
注意 - 只有在applicationhost.config中的httpCompression部分解锁时才有效。默认情况下,该部分被锁定以防止修改,因此在web.config中进行覆盖是不起作用的。我浪费了几个小时来解决这个问题。请参阅https://dev59.com/_HRB5IYBdhLWcg3wF0DH#2894695文章下面的评论。 - Karel Kral
请确保它作为Web角色的已安装功能,并且,来自MSDN:"您还可以为MIME类型添加通配符条目。但是,您只能在Web服务器级别设置MIME类型。例如,要为默认网站启用所有MIME类型的静态压缩,请先为服务器级别的MIME类型添加通配符条目,然后再为默认网站启用静态压缩。" - Luke Puplett
12
除非您在服务器上安装了动态内容压缩模块(可通过 Web 平台安装程序获得),否则动态压缩也无法起作用。如果您正在使用 Css/Js 捆绑,则需要此模块。 - Mark
如果您可以访问IIS安装程序但web.config被阻止,上述技巧仍然无法起作用。解锁/启用IIS压缩的简单方法:appcmd set config /section:urlCompression /doStaticCompression:True - j0ffe
小心IIS 7.5!!仅拥有<httpCompression><urlCompression>部分是不够的,因为只有当文件经常被访问时,IIS才会考虑对其进行压缩。因此,您需要调整此设置<serverRuntime frequentHitThreshold="some_val_here" frequentHitTimePeriod="some_val_here" />。更多信息请参见:https://dev59.com/K2w05IYBdhLWcg3w72M0#15626981 <br>如果您决定通过Notepad++或任何其他32位编辑器在x64位Windows上编辑%windir%\System32\inetsrv\config\applicationHost.config,则可能需要使用另一个路径,请参见:http://forums.iis.net/t/1151982.aspx - Alec
显示剩余5条评论

58
您需要在Windows功能控制面板中启用该功能:

IIS 功能截图


17
在Windows Server 2008 R2中,此设置位于服务器管理器 > 角色 > Web 服务器 (IIS) 下。在“角色”部分中单击“添加角色服务”。在“性能”标题下列出了“动态内容压缩”选项。 - Jonathan Little

37

在 HttpModule 中实现全局 Gzip

如果您没有访问最终的 IIS 实例(例如共享托管环境...),则可以创建一个 HttpModule,在每个 HttpApplication.Begin_Request 事件中添加以下代码:

HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;

测试

赞同,没有测试就不会有解决方案。我喜欢使用Firefox插件“Liveheaders”,它显示了浏览器和服务器之间的每个http消息的所有信息,包括压缩、文件大小(可以与服务器上的文件大小进行比较)。


3
我正在使用共享托管,无需编写任何代码即可启用GZIP输出压缩。仅通过Web.config就可以实现。请参阅我的回答:https://dev59.com/S3RB5IYBdhLWcg3wJklC#5444505 - Drew Noakes
2
我将前三行代码放在了我想要压缩的aspx页面的开头,它起作用了!谢谢!这比其他任何方法都要简单得多,并且在我的IIS 6上也可以使用。 - DenNukem
1
这绝对是正确的做法。 - Matthew James Davis

5
在Windows 2012 R2中,可以在此处找到:

enter image description here


2
我只需要按照Charlie的建议在Windows功能中添加此功能。对于无法在Windows 10或Server 2012+上找到它的人,请按以下方式查找。我有点困难。

Windows 10

enter image description here

Windows Server 2012 R2

enter image description here

Windows Server 2016

enter image description here


1

1
如果您使用Firebug和YSlow分析页面性能,YSlow肯定会告诉您哪些页面上的工件没有进行gzip压缩!

1

对于所有不得不与德国服务器/德语服务器斗争的可怜人 :)

auf deutsch bitte schön


0

0

尝试安装了Firebug插件的Firefox浏览器。我正在使用它,这是一个非常适合Web开发人员的工具。

我还在我的IIS7中使用web.config启用了Gzip压缩。


谷歌还提供了一个页面测试工具:https://developers.google.com/speed/pagespeed/insights/ - Dr. Aaron Dishno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接