Я пытаюсь использовать http / 2 для всего, кроме Safari, из-за некоторого странного поведения, которое мы наблюдаем при использовании http / 2 с любой версией Safari, которая у нас есть. Однако я не могу понять, как настроить Apache для этого. Может ли кто-нибудь пролить свет на то, почему следующее не работает?
BrowserMatchNoCase Safari NOHTTP2
# Chrome includes both Safari and Mozilla in its User Agent
BrowserMatchNoCase Chrome !NOHTTP2
<IfDefine NOHTTP2>
Protocols http/1.1
</IfDefine>
<IfDefine !NOHTTP2>
Protocols h2 h2c http/1.1
</IfDefine>
Это в настоящее время в /etc/apache2/mods-enabled/http2.conf
. У меня нет опыта с IfDefine
или BrowserMatch
, поэтому я не уверен, правильно ли я это делаю (учитывая, что это не работает, похоже, что нет). В каждом браузере, в котором я его тестирую, по-прежнему включен http / 2 с указанной выше конфигурацией, а также в любых других, которые я тестировал.
Я тоже пробовал SetEnvIfNoCase User-Agent
вместо того BrowserMatch
, и различные варианты кроме IfDefine
Такие как If
и Directory
, но все они выдают ошибку «Протоколы здесь не разрешены» при запуске configtest.
Я использую Apache 2.4.25 на Debian 9.6.
Я подозреваю, что вы не можете делать то, что хотите, потому что к тому времени, когда вы выяснили, какой браузер использует клиент, вы уже согласовали протокол и получили запрос; User-Agent представлен как заголовок запроса.
Твой первый <IfDefine>
блок будет работать, только если вы запустите httpd
двоичная передача -DNOHTTP2
в качестве дополнительного аргумента, и это ограничит протокол HTTP / 1.1 для всех клиентов. Поскольку определение не установлено, по умолчанию используется второй блок, который включает все протоколы. Видеть https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine