我的团队目前正在尝试在 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
是否gzip
也deflate
启用了压缩。
显而易见的解决方案是禁用服务器上的gzip
和,这样就只有这两个匹配了。但是,由于大约 20-25% 的互联网用户(截至 2018 年初)仍在使用不支持 Brotli 的旧版 Web 浏览器,因此您可能希望在服务器上保持启用状态,以支持这些客户端的压缩,至少在一段时间内是这样。deflate
br
gzip
如果您希望同时启用两个(或所有三个)方案,则必须采取一些措施来强制 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=0
)Accept-Encoding
并将其重写为普通的br
,只给IIS一个选择。
请注意,默认的 URL 重写配置不允许修改变量HTTP_ACCEPT_ENCODING
。allowedServerVariables
元素会覆盖该限制,并且必须在 中进行配置applicationHost.config
。然后可以在配置层次结构中的任何级别定义重写规则,尽管将其设为全局可能更有意义。
答案2
答案3
根据文档从 8.5 开始,所有版本的 IIS 都不再允许在服务器级别配置压缩方案的偏好。由于浏览器必须“询问”服务器它支持哪些压缩方案,并且所有浏览器都在 gzip 后面安装了 Brotli,因此没有人能够在 IIS 8.5 及更高版本上使用 Brotli。:-(