在 IIS 上启用 Brotli 压缩

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是否也启用gzipdeflate压缩。

显而易见的解决方案是在您的服务器上禁用gzipdeflate,以便这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=0Accept-Encoding并将其重写为纯br,仅给 IIS 一个选择。

请注意,默认的 URL 重写配置不允许修改HTTP_ACCEPT_ENCODING变量。该allowedServerVariables元素会覆盖该限制,并且必须在applicationHost.config. 然后可以在配置层次结构中的任何级别定义重写规则,尽管将其设为全局可能是有意义的。