在 IIS 上启用 Brotli 压缩

在 IIS 上启用 Brotli 压缩

我的团队目前正在尝试在 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>

我尝试不使用 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 Temporary Compressed Files”,然后重新启动了网络服务器。

在网站的 web.config 中,我尝试在<system.webServer>部分中添加和不添加此行:

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

我仍然在 Chrome 开发控制台中看到对 zorgbeurs.nl 的 200 请求:

响应标头

访问控制允许标头:内容类型
访问控制允许来源:*
缓存控制:私有
内容编码:gzip
内容长度:14252
内容类型: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

就像配置被完全忽略了一样。

我还可以尝试什么?

答案1

你提到的 Brotli 模块似乎需要付费许可证,所以我没有尝试过,但我自己也遇到了类似的问题适用于 IIS 的开源 Brotli 插件

当前浏览器在标头之后gzip和标头deflate中宣传 Brotli 支持Accept-Encoding。典型的标头如下所示:Accept-Encoding: gzip, deflate, br

HTTP 请求没有具体说明如何从Accept-Encoding具有相同优先级的多个值中进行选择,因此将内容返回给这些客户端是可以接受的br。但是,IIS 将选择第一个与其配置的压缩方案之一匹配的值(从左到右)。这意味着它不会选择br是否gzipdeflate启用了压缩。

显而易见的解决方案是禁用服务器上的gzip和,这样就只有这两个匹配了。但是,由于大约 20-25% 的互联网用户(截至 2018 年初)仍在使用不支持 Brotli 的旧版 Web 浏览器,因此您可能希望在服务器上保持启用状态,以支持这些客户端的压缩,至少在一段时间内是这样。deflatebrgzip

如果您希望同时启用两个(或所有三个)方案,则必须采取一些措施来强制 IIS 选择br何时可以接受。为此,您可以修改Accept-Encoding在请求进入 IIS 管道时修改请求的标头值。IIS URL 重写模块让一切变得简单。

Accept-Encoding头由 IIS 管道中的服务器变量表示HTTP_ACCEPT_ENCODING,您可以在它到达压缩模块之前对其进行修改。以下是示例配置:

<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>

上述规则只是在标题中查找字符串br(由单词边界包围并且后面不紧跟着;q=0Accept-Encoding并将其重写为普通的br,只给IIS一个选择。

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

答案2

答案3

根据文档从 8.5 开始,所有版本的 IIS 都不再允许在服务器级别配置压缩方案的偏好。由于浏览器必须“询问”服务器它支持哪些压缩方案,并且所有浏览器都在 gzip 后面安装了 Brotli,因此没有人能够在 IIS 8.5 及更高版本上使用 Brotli。:-(

答案4

https://github.com/saucecontrol/BrotliIIS可能会帮助你解决问题

相关内容