9

我正在尝试使用iisspeed.com的“ Microsoft IIS 的 Brotli 压缩模块”让新的Brotli压缩方案在 IIS 中工作。

如果我将<httpCompression>配置部分更改applicationHost.config只有Brotli 模块,Brotli 压缩模块本身就可以正常工作。

问题是我想同时拥有gzip和 Brotli,并且更喜欢 Brotli

iisspeed.com 上的文档说要这样做:

<httpCompression directory="path\to\temp\folder" minFileSizeForComp="50">
        <scheme name="br" dll="path\to\iisbrotli.dll" />
        <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
        ...
</httpCompression>

但是我发现这不起作用。

浏览器(本例中为 Chrome)发送以下accept-encoding标头:

accept-encoding: gzip, deflate, sdch, br

这意味着浏览器可以接受 Brotli 编码br以及gzip. 我希望 IIS 更喜欢brgzip但似乎没有办法对<scheme>config 中的每个元素进行优先级排序。我尝试更改 .config 文件中的顺序,但没有效果。

IIS 始终使用gzip,即使br受支持,并且会首选,因为它的文件大小更小。

我搜索了谷歌,发现在 IIS 6 中每个压缩方案都有一个优先级设置,但它似乎已在 IIS7+ 中删除。

它被调用HcPriority并进入 IIS6 元数据库 XML 文件。

请参阅以下链接:

https://msdn.microsoft.com/en-us/library/ms525366(v=vs.90).aspx

https://blogs.iis.net/ksingla/changes-to-compression-in-iis7

https://forums.iis.net/t/1150520.aspx

如果客户端接受它,我可以为 IIS7+ 做些什么来告诉 IIS 更喜欢br它吗?gzip

4

2 回答 2

9

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

正如您所指出的,当前的浏览器在标头之后gzip和标头中宣传 Brotli 支持。deflateAccept-Encoding

HTTP RFC没有提供关于如何从具有相同优先级的多个值中进行选择的具体指导,Accept-Encoding因此将br内容返回给这些客户端是可以接受的。但是,似乎 IIS 总是选择与其配置的压缩方案之一匹配的第一个(从左到右)。

如果您希望启用这两个方案,您可以Accept-Encoding在请求进入您的 IIS 管道时修改请求的标头值。IIS URL 重写模块可以通过一个简单的规则来做到这一点。

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

<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并将其重写为只是 plain br,给 IIS 仅一个选择。

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

于 2018-02-08T04:03:15.457 回答
2

从您的第二个链接(重点是我的):

当多个请求出现在 Accept-Encoding 标头中时,HcPriority 被删除作为使用的方案,这取决于在 Accept-Encoding 标头中首先出现的方案(假设没有 q 因子)。这是根据 HTTP 规范

还在这里讨论:HTTP:“gzip,deflate”的首选接受编码是什么?

如果您通过允许您手动设置请求标头(例如PostmanFiddlerAccept-Encoding: br, gzip, deflate )的 HTTP 客户端或允许您更改请求标头的浏览器扩展(例如Chrome 的ModHeader)发出相同的请求,您应该会看到即使 gzip 和/或 deflate 可用,也使用 Brotli 编码的响应。

编辑:我能够通过将 Brotli 模块注册为全局本机模块并在两个动态和静态压缩模块。

于 2016-12-01T23:54:53.353 回答