【问题标题】:IIS application missing Content-Encoding - gzip in Response HeaderIIS 应用程序缺少内容编码 - 响应标头中的 gzip
【发布时间】:2016-11-10 01:28:45
【问题描述】:

在 Firebug 中,请求标头具有以下条目:
Accept-Encoding: gzip, deflate

但是没有:
内容编码:gzip
在响应标头中。

无论我尝试过什么,按照 SO 和其他网站上的一些答案,似乎都没有任何效果!静态文件和动态文件都没有被压缩,或者至少如果它们没有内容编码 - gzip 值会在响应标头中返回。

这是我的 web.config 设置的示例:

<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true" />
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="150" staticCompressionIgnoreHitFrequency="true">
  <remove name="gzip" />
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="8" dynamicCompressionLevel="8" />
</httpCompression>

我忽略了点击频率
staticCompressionIgnoreHitFrequency="true"

我已确认 IIS 实际上正在压缩我可以在以下位置看到的文件:
C:\inetpub\temp\IIS 临时压缩文件

此处指定:set up gzip in IIS 8 windows 8
我已确保在 Windows 功能 > Internet 信息服务 > WWW 服务 > 性能功能中启用了静态和动态压缩

我也试过这个人的方法:
IIS 7.5 Compression creates compressed file but returns the non-compressed one


编辑 1:
IIS 版本是 10,但我也在 IIS 8.5 上试过这个


编辑 2:
我现在还尝试了在此链接中找到的各种配置文件: https://github.com/h5bp/server-configs-iis/ 提供了一些看起来像“最佳实践”的 web.config 文件。
未解决


编辑 3:
根据@Nkosi 的输入,我创建了一个全新的 Asp.net MVC 应用程序,并使用我尝试过的所有这些选项对其进行了配置。 这是我从 Fiddler 那里得到的原始标题:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/javascript; charset=UTF-8
Expires: Wed, 20 Jul 2016 18:22:47 GMT
Last-Modified: Wed, 20 Jul 2016 18:22:47 GMT
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 20 Jul 2016 18:22:47 GMT

如您所见,没有 Content-Encoding:Gzip
未解决


编辑 4:
我已经尝试过将代码添加到 Global.asax 部分中的 BeginRequest 事件的这种方法:https://stackoverflow.com/a/27185575/392591
未解决


编辑 5:
所以我只是尝试根据这个答案启用跟踪 SO:https://stackoverflow.com/a/33182525/392591
没有失败,但我确实注意到在跟踪文件的底部有一个名为 GENERAL_RESPONSE_HEADERS 的部分,它提供了以下内容:

Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: My Little Pony
X-UA-Compatible: IE=Edge,chrome=1

这适用于每个静态类型文件。
但是我刚刚在跟踪文件中发现了以下内容:

8. STATIC_COMPRESSION_START  08:04:03.552 
9. STATIC_COMPRESSION_NOT_SUCCESS Reason="NOT_FREQUENTLY_HIT" 08:04:03.552 
10. STATIC_COMPRESSION_END  08:04:03.552 

由于不经常命中的原因压缩不成功...奇怪,因为我肯定将忽略命中频率选项设置为真!

所以我刚刚进入 IIS 管理器并在服务器上将忽略命中频率设置为 true(即 applicationHost.config)并将跟踪文件输出更改为以下内容:

8. STATIC_COMPRESSION_START  08:19:17.489 
9. STATIC_COMPRESSION_SUCCESS  08:19:17.489 
10. STATIC_COMPRESSION_END  08:19:17.489 

我返回并在 applicationHost.config 中将其关闭,然后它又返回静态压缩不成功,所以这肯定会有所作为。但是,当我查看 FireBug 时,它仍然交付未压缩的文件并且没有 GZIP 内容编码响应标头。

我在失败的请求跟踪中注意到的另一个有趣的一点是最后两个整体 GENERAL_FLUSH_RESPONSE_END 和 GENERAL_REQUEST_END 两者都显示我的 Bootstrap.css 文件发送了 17903 个字节,大约 18kb,与我在我的文件中看到的压缩版本相匹配IIS 临时压缩文件文件夹。所以文件正在物理上被压缩,根据失败的请求跟踪它正在发送正确的内容......但是浏览器会选择完整的 117kb 文件吗?
未解决


【问题讨论】:

  • 我使用的是 IIS10,而我的 web.config 只有&lt;urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" /&gt;。当我测试从浏览器(Firefox、IE11、Edge、Google Chrome)到简单 MVC 应用程序的请求时。请求都有Accept-Encoding: gzip, deflate,响应返回Content-Encoding:gzip
  • this。也许您需要在服务器上启用 gzip 功能。
  • @LucasSegers - 该功能肯定已启用。
  • 我遇到了同样的问题,失败的请求跟踪显示文件已被正确压缩。 GENERAL_FLUSH_RESPONSE_START 中显示了正确的响应标头,GENERAL_REQUEST_END 中显示了正确的大小,但浏览器仍在获取完整文件。
  • 我遇到了同样的问题。有答案吗?

标签: asp.net iis http-compression iis-10


【解决方案1】:

我的 IIS 和 gzip 配置也有类似的情况

在 Firebug 中,请求标头具有以下条目: 接受编码:gzip、deflate

但没有:Content-Encoding: gzip 在响应标头中。

就我而言,问题在于防病毒保护。实际上应用了 gzipping,但 antivirus 启用了设置 protect http 连接(取决于具体程序),解压缩响应检查它,然后动态重写响应标头。

注意:当某些代理/防病毒更改您的响应标头时的关键属性,即消失时 Content-LengthTransfer-Encoding添加了值chunked

【讨论】:

  • 谢谢。你拯救了我的一天。 Eset nod 正在更改响应标头并解压缩响应
  • 看起来防病毒程序会拦截存档并在将其传递给浏览器之前将其解压缩,因此浏览器将始终在其处于活动状态时接收未压缩的存档。尝试在仅关闭 Windows Defender 或杀毒软件的机器上进行测试,然后查看是否获得内容编码
【解决方案2】:

我使用的是 IIS10,我的 web.config 有

<system.webServer>
    <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />
    <!-- other config removed for brevity -->
</system.webServer>

当我测试从浏览器(Firefox、IE11、Edge、Google Chrome)到简单 MVC 应用程序的请求时。

请求都有Accept-Encoding: gzip, deflate,响应返回Content-Encoding:gzip

我什至用 Fiddler 对其进行了测试。手动编写请求

GET http://localhost/MyWebApplication HTTP/1.1
User-Agent: Fiddler
Host: localhost
Accept-Encoding: gzip, deflate

得到同样的结果

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 18 Jul 2016 15:26:06 GMT
Content-Length: 3826

...

正在压缩 Css、Js 和所有其他基于文本的文件。

您可能需要重新检查您的配置,以确保您在 IIS 和 web.config 中正确配置了压缩。

更新:

我确实注意到图像没有被压缩

请求

GET http://localhost/MyWebApplication/Images/Logo_small.png HTTP/1.1
User-Agent: Fiddler
Host: localhost
Accept-Encoding: gzip, deflate

回应

HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Type: image/png
Last-Modified: Fri, 27 Nov 2015 03:15:22 GMT
Accept-Ranges: bytes
ETag: "c9d1fdd9c128d11:0"
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Mon, 18 Jul 2016 15:33:02 GMT
Content-Length: 2970

...

在一些 google-fu 发现图像通常已经压缩,因此没有应用 gzip。

来自 web.config 的完整 system.webServer

  <system.webServer>
    <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />
   <validation validateIntegratedModeConfiguration="false" />
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <error statusCode="404" responseMode="ExecuteURL" path="/NotFound" />
    </httpErrors>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <staticContent>
      <remove fileExtension=".woff" />
      <remove fileExtension=".woff2" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>

【讨论】:

  • 我已经更新了我的问题,请参阅编辑 3。您从示例中删除了哪些代码,有什么可能改变我的结果?
  • @Jacques,剩下的配置是httpErrors, handler, staticContent。我把它保持在最低限度。我会将其包含在更新中。
  • 好的,我认为这不会影响这个问题。我已经用我刚刚尝试过的另一个解决方案添加了另一个更新,但仍然没有乐趣。
【解决方案3】:

我也遇到了同样的问题。原因最终是dynamicCompressionBeforeCache="true" 设置。将此属性更改为 "false" 解决了问题。

<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />

我在 SmarterASP.Net 提供的共享服务器上运行一些站点。我向他们提出了支持票,一路上我确定dynamicCompressionBeforeCache="true" 是罪魁祸首。

我向他们指出了涵盖此属性的 Microsoft 文档,地址为 https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression,并询问他们为什么设置 "true" 会导致此问题。

SmarterASP.Net 支持参考了文档的一部分说明...

如果dynamicCompressionBeforeCache属性为true时输出 缓存响应已刷新,动态压缩不会 在将响应放入输出缓存之前执行。

...他们说...

"我们的服务器端没有保存输出缓存。所以输出缓存 响应总是被刷新并导致问题。”

我不能说我完全理解这里的机制,或者为什么 SmarterASP.Net 不保存输出缓存。但是dynamicCompressionBeforeCache="false" 的设置绝对解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多