Назад | Перейти на главную страницу

Включение сжатия Brotli в IIS

Моя команда в настоящее время пытается установить сжатие Brotli на VPS: 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 для запроса 200 на zorgbeurs.nl:

Заголовки ответа

Access-Control-Allow-Headers: Content-Type
Доступ-Контроль-Разрешить-Происхождение: *
Cache-Control: частный
Кодирование содержимого: gzip
Длина содержимого: 14252
Content-Type: текст / html; charset = utf-8
Дата: пт, 30 декабря 2016 г., 19:01:48 GMT
Сервер: Microsoft-IIS / 8.5
Set-Cookie: showcookiebar = false; путь = /
Vary: Accept-Encoding
X-AspNet-Версия: 4.0.30319
X-Powered-By: ASP.NET

Как будто конфигурация полностью игнорируется.

Что еще можно попробовать?

Похоже, для модуля Brotli, на который вы ссылались, требуется платная лицензия, поэтому я не пробовал, но столкнулся с аналогичной проблемой со своим плагин Brotli с открытым исходным кодом для IIS.

Текущие браузеры рекламируют поддержку Brotli после gzip и deflate в Accept-Encoding заголовок. Типичные заголовки будут выглядеть так: Accept-Encoding: gzip, deflate, br.

В HTTP RFC не дает конкретных указаний о том, как выбирать из множества Accept-Encoding значения с тем же приоритетом, поэтому было бы приемлемо вернуть br контент для этих клиентов. Однако IIS выберет первую (слева направо), которая соответствует одной из настроенных схем сжатия. Это означает, что он не выберет br если либо gzip или deflate сжатие также включено.

Очевидное решение - отключить gzip и deflate на вашем сервере, чтобы br это единственный матч. Однако, поскольку примерно 20-25% интернет-пользователей (по состоянию на начало 2018 года) все еще используют старые веб-браузеры, не поддерживающие Brotli, вы, вероятно, захотите сохранить gzip включен на вашем сервере для поддержки сжатия для этих клиентов, по крайней мере, на некоторое время.

Если вы хотите оставить обе (или все три) схемы включенными, вы должны, следовательно, предпринять некоторые действия, чтобы заставить IIS выбрать br когда это приемлемо. Для этого вы можете изменить Accept-Encoding значение заголовка запросов при их поступлении в конвейер IIS. В Модуль перезаписи URL-адресов IIS делает это легко.

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

Правило выше просто ищет строку br (окружен границами слов и не сразу следует ;q=0) в Accept-Encoding заголовок и переписывает его, чтобы он был простым br, предоставляя IIS только один выбор.

Обратите внимание, что конфигурация перезаписи URL по умолчанию не позволяет изменять HTTP_ACCEPT_ENCODING переменная. В allowedServerVariables элемент отменяет это ограничение и должен быть настроен в applicationHost.config. Затем правило перезаписи может быть определено на любом уровне иерархии конфигурации, хотя, вероятно, имеет смысл сделать его глобальным.

Сжатие Brotli теперь официально поддерживается в IIS:

https://docs.microsoft.com/en-us/iis/extensions/iis-compression/iis-compression-overview

https://github.com/Microsoft/IIS.Compression

https://github.com/saucecontrol/BrotliIIS может помочь вам с проблемой

Согласно документация все версии IIS начиная с 8.5 больше не позволяют настраивать предпочтительные схемы сжатия на уровне сервера. Поскольку браузеры должны «спрашивать» сервер, какие схемы сжатия он поддерживает, а все браузеры имеют Brotli за gzip, никто не сможет использовать Brotli в IIS 8.5 и новее. :-(