Ada*_*dam 1 compression gzip web.config windows-server-2012-r2 iis-8.5
我的团队目前正在尝试在 VPS 上安装 Brotli 压缩:Windows Server 2012 R2 和 IIS8.5 使用 64 位模块,可在此处下载:https ://www.iispeed.com/pagespeed/products/iisbrotli
但是无论我们尝试什么,当我在以下位置填写 https 域名时:https://tools.keycdn.com/brotli-test 我收到一条消息
消极的!www.zorgbeurs.nl 不支持 Brotli 压缩。
在 IIS 中,这两个模块对该站点处于活动状态:
DynamicCompressionModule
StaticCompressionModule
到目前为止我们尝试过的:
将此添加到 applicationHost.Config 文件中:
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="br" dll="C:\inetpub\iisbrotli64.dll" />
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" 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/x-javascript" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</staticTypes>
</httpCompression>
Run Code Online (Sandbox Code Playgroud)
我在没有 gzip 线的情况下尝试过 <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
我已经停止并启动了 IIS。
我想检查缓存是否是问题,所以我清除了文件夹中的文件:
“C:\Windows\Temp”、“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root”和“%SystemDrive%\inetpub\temp\IIS 临时压缩文件”,然后重新启动网络服务器。
在网站的 web.config 中,我尝试在该<system.webServer>部分中使用和不使用此行:
<urlCompression doStaticCompression="true" doDynamicCompression="true" />
Run Code Online (Sandbox Code Playgroud)
我仍然在 Chrome 开发控制台中看到了对 zorgbeurs.nl 的 200 请求:
响应头
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Origin:*
Cache-Control:private
Content-Encoding:gzip
Content-Length:14252
Content-Type:text/html; charset=utf-8
日期:2016 年 12 月 30 日星期五 19:01:48 GMT
服务器:Microsoft-IIS/8.5
Set-Cookie:showcookiebar=false;path=/
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
就好像配置被完全忽略了一样。
我还能尝试什么?
小智 5
看来您引用的 Brotli 模块需要付费许可证,所以我还没有尝试过,但是我自己的 IIS 开源 Brotli 插件也遇到了类似的问题。
当前浏览器在标头之后gzip和标头中宣传 Brotli 支持。典型的标题看起来像:.deflateAccept-EncodingAccept-Encoding: gzip, deflate, br
在HTTP RFC给出了如何从众多选择没有具体的指导Accept-Encoding值具有相同的优先级,所以它是可以接受的返回br内容的客户端。但是,IIS 将选择与其配置的压缩方案之一匹配的第一个(从左到右)。这意味着它不会选择br是否也启用gzip或deflate压缩。
显而易见的解决方案是在您的服务器上禁用gzip和deflate,以便这br是唯一的匹配项。但是,由于大约 20-25% 的互联网用户(截至 2018 年初)仍在使用不支持 Brotli 的旧版 Web 浏览器,因此您可能希望gzip在服务器上保持启用状态以支持这些客户端的压缩,至少在一段时间内虽然更长。
如果您希望启用这两个(或所有三个)方案,则必须采取一些措施来强制 IISbr在可接受时进行选择。为此,您可以Accept-Encoding在请求进入 IIS 管道时修改请求的标头值。在IIS URL重写模块很容易。
该Accept-Encoding头是由表示HTTP_ACCEPT_ENCODING在IIS管道服务器变量,并且其到达压缩模块(一个或多个)之前可以修改它。这是一个示例配置:
<rewrite>
<allowedServerVariables>
<add name="HTTP_ACCEPT_ENCODING" />
</allowedServerVariables>
<rules>
<rule name="Prioritize Brotli">
<match url=".*" />
<conditions>
<add input="{HTTP_ACCEPT_ENCODING}" pattern="\bbr(?!;q=0)\b" />
</conditions>
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="br" />
</serverVariables>
</rule>
</rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)
上面的规则只是在标头中查找字符串br(由字边界包围,而不是紧跟其后;q=0)Accept-Encoding并将其重写为纯br,仅给 IIS 一个选择。
请注意,默认的 URL 重写配置不允许修改HTTP_ACCEPT_ENCODING变量。该allowedServerVariables元素会覆盖该限制,并且必须在applicationHost.config. 然后可以在配置层次结构中的任何级别定义重写规则,尽管将其设为全局可能是有意义的。