在Firebug中,请求标头具有以下条目:
接受编码: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
&#34;
我已经确认IIS实际上压缩了我可以看到的文件:
C:\ inetpub \ temp \ IIS临时压缩文件
如此处所述:set up gzip in IIS 8 windows 8
我已确保在Windows功能中启用静态和动态压缩&gt;互联网信息服务&gt; WWW服务&gt;性能特点
我也试过这个人的方法:
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
压缩不成功的原因不经常发生......奇怪的是因为我肯定将Ignore Hit Frequency选项设置为true!
所以我刚进入IIS管理器并在服务器上将Ignore Hit Frequency设置为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内容编码响应头。
我在失败请求跟踪中注意到的另一个有趣的位是最后两个entires GENERAL_FLUSH_RESPONSE_END和GENERAL_REQUEST_END两个都显示我的Bootstrap.css文件发送了17903个字节,大约18kb,匹配我在我看到的文件的压缩版本IIS Temporary Compressed Files文件夹。因此文件在物理上被压缩,根据失败的请求跟踪,它发送正确的内容......但是浏览器会选择完整的117kb文件? 未解决
答案 0 :(得分:1)
我正在使用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>
答案 1 :(得分:0)
我对预配置的IIS有类似的问题。
经过多次尝试,我们发现问题是GZIP安装中的一个错误,只需在控制面板中重新安装该功能就可以解决问题。
答案 2 :(得分:0)
我有类似IIS和gzip配置的情况
在Firebug中,请求标头包含以下条目: 接受编码:gzip,deflate
但是没有:内容编码:gzip 在响应标头中。
就我而言,问题在于防病毒保护。实际上已应用gzipping,但防病毒已启用设置保护http连接(取决于具体程序),解压缩响应检查并在动态重写响应标头之后。
注意:当某个代理/防病毒软件更改了您的响应标头时,一个关键属性就是消失 Content-Length
和 Transfer-Encoding
添加值 chunked 。
答案 3 :(得分:0)
我刚刚遇到了同样的问题。原因最终是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"
绝对可以解决我的问题。