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

Используйте разные протоколы HTTP для каждого браузера в Apache

Я пытаюсь использовать 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