我已经在 IIS 7 中启用了动态内容压缩,但 Fiddler 显示我的动态页面仍然在没有内容编码:gzip 的情况下提供。
静态内容压缩在同一服务器上运行良好。
不确定这是否重要,但大多数动态页面都是 coldfusion 页面(Coldfusion 配置为 ISAPI 扩展)并且我们也使用 IIS URL 重写模块。
这是来自我的 applicationhost.config。
<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 doDynamicCompression="true" />
以下是一个示例请求:
GET / HTTP/1.1
Host: web5.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
和响应头:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/7.0
...
Date: Mon, 22 Feb 2010 20:59:36 GMT
答案1
您可以按照此处提到的故障排除步骤进行操作。使用服务帐户在 IIS 6 和 IIS 7 中进行 HTTP 压缩
答案2
“Content-Endcoding: chunked” 永远不应出现在服务器响应中。“Chunked” 是 HTTP 规范的一个独立部分,完全是“Transfer-Encoding”。除了“Transfer-Encoding: chunked”之外,您还应该查找“Content-Encoding: gzip”。以下是 Google 主页上的一个示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Date: Wed, 17 Feb 2010 13:43:22 GMT
Expires: Wed, 17 Feb 2010 13:43:22 GMT
Cache-Control: private, must-revalidate, max-age=0
Last-Modified: Wed, 17 Feb 2010 13:43:22 GMT
Server: igfe
Transfer-Encoding: chunked
Content-Encoding: gzip
现在,就调试您的问题而言,IIS7 根据内容类型进行压缩。因此,当它看到“Content-Type:text/html”时,它会压缩页面。因此,首先,确保您的脚本返回的是 IIS 认为可压缩的内容类型 (text/*)。
此外,默认情况下,IIS 不会针对 HTTP/1.0 请求(某些代理使用,例如 Squid)或表明请求来自代理服务器(Via: 或 X-Forwarded-For:)的标头压缩页面。这是一种保守的默认设置,用于处理大量无法正确处理压缩 HTTP 内容的旧代理。您可以通过编辑 IIS 配置文件(在服务器或站点级别)来覆盖此行为。
最后,确保您的客户端在请求中发送了“Accept-Encoding: gzip”标头。如果是标准浏览器,默认情况下会发送,但如果您使用 wget 或其他工具,则可能不会发送。您可以使用Fiddler查看整个 HTTP 对话,包括标头和数据。
答案3
经过研究我发现这这表明当 Coldfusion 从模板生成 HTML 时,也需要在 Coldfusion 端启用压缩。我找不到确切的来源,但如果我没记错的话,动态压缩针对的是 ASP.Net 和 PHP,但对于后者,它仍然需要在 PHP 框架中启用。
因此,我假设您没有看到压缩发生的原因是因为它需要在生成器端启用,在本例中是 Coldfusion。
答案4
请使用记事本来编辑 applicationHost.config。我浪费了几个小时才明白我在 notepad++(以及在 Visual Studio 2010 编辑器中!!)中所做的更改未被 IIS 应用。
将额外的 mimeType 添加到 dynamicTypes/staticTypes 集合中的另一种方法是使用 appcmd。"C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphost
再次强调:完成这些更改后,您只能在记事本中看到它们。Notepad++(以及 Visual Studio 2010 编辑器!!)为 applicationHost.config 维护了某种替代现实/存储。即使在记事本中编辑文件并在 np++/VS 中重新打开后,它仍会向您显示该文件的自己的版本(与您在记事本中看到的版本不同)。