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

the*_*man 7 iis gzip http-compression http-headers brotli

我试图通过iisspeed.com使用" 用于Microsoft IIS的Brotli压缩模块 "在IIS中使用新的Brotli压缩方案.

如果我将<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>
Run Code Online (Sandbox Code Playgroud)

但是我发现这不起作用.

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

accept-encoding: gzip, deflate, sdch, br

这意味着浏览器可以接受Brotli编码br以及gzip.我希望IIS更喜欢br,gzip但似乎没有办法优先<scheme>配置配置中的每个元素.我已经尝试更改.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喜欢brgzip,如果客户接受呢?

sau*_*rol 7

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

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

HTTP RFC给出了如何从众多选择没有具体的指导,Accept-Encoding具有相同优先级的值,所以它是可以接受的返回br内容的客户端.但是,似乎IIS总是选择与其配置的压缩方案之一匹配的第一个(从左到右).

如果您希望启用两个方案,则可以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=0),Accept-Encoding并将其重新编写为纯文本br,只给IIS一个选择.

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