在 IIS7/8/8.5 中指定多个(gzip + brotli)httpCompression 方案并优先考虑 brotli

Specify multiple (gzip + brotli) httpCompression schemes in IIS7/8/8.5 and prioritise brotli

我正在尝试获取新的 Brotli compression scheme working in IIS using "Brotli compression module for Microsoft IIS" by iisspeed.com

如果我将 applicationHost.config 中的 <httpCompression> 配置部分更改为 只有 有 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 header:

accept-encoding: gzip, deflate, sdch, br

这意味着浏览器可以接受 Brotli 编码 br 以及 gzip我希望 IIS 优先选择 br 而不是 gzip,但似乎没有办法确定配置 中每个 <scheme> 元素的优先级。我试过更改 .config 文件中的顺序,但没有效果。

IIS 始终使用 gzip,即使支持 br 也是首选,因为它的文件较小。

我搜索 Google 发现 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

来自你的第二个 link(强调我的):

HcPriority is removed as scheme to use when multiple ones appear in Accept-Encoding header of request is picked depending on scheme which is appear first in Accept-Encoding header (assuming no q factor). This is as per HTTP specs.

也在这里讨论:HTTP: What is the preferred Accept-Encoding for “gzip,deflate”?

如果您使用 Accept-Encoding: br, gzip, deflate 发出相同的请求,通过允许您手动设置请求 headers 的 HTTP 客户端(例如 Postman or Fiddler) or a browser extension that allows you to change the request headers (e.g. ModHeader 代表 Chrome) ,即使 gzip and/or deflate 可用,你也应该看到用 Brotli 编码的响应。

编辑:我能够通过 registering it as a global native module 并在动态和静态压缩模块之前对其进行排序。

您引用的 Brotli 模块似乎需要付费许可证,所以我没有尝试过,但我自己的 open source Brotli plugin for IIS.

遇到了类似的问题

正如您所指出的,当前浏览器在 Accept-Encoding header.

中的 gzipdeflate 之后宣传 Brotli 支持

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

如果您希望同时启用这两种方案,您可以在请求进入您的 IIS 管道时修改 Accept-Encoding header 值。 IIS URL Rewrite Module 可以用一个简单的规则来做到这一点。

Accept-Encoding header 由 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>

上面的规则在 Accept-Encoding header 和 re-writes 很简单 br,只给 IIS 一个选择。

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