在 Apache 中为每个浏览器使用不同的 HTTP 协议

在 Apache 中为每个浏览器使用不同的 HTTP 协议

我尝试在除 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。我没有使用过IfDefineBrowserMatch,所以我不确定我是否做得正确(鉴于它不起作用,似乎我没有做到)。我测试过的每个浏览器仍然启用了上述配置的 http/2,以及我测试过的任何其他浏览器。

我也尝试过SetEnvIfNoCase User-Agent而不是BrowserMatch,以及 之外的各种选项,例如IfDefineIfDirectory但所有这些选项在运行 configtest 时都会抛出“此处不允许使用协议”错误。

我在 Debian 9.6 上运行 Apache 2.4.25。

答案1

我怀疑你无法做你想做的事,因为当你弄清楚客户端正在使用的浏览器时,你已经协商了协议并收到了请求;用户代理作为请求标头提交。

第一个块仅在您将二进制文件作为额外参数传递<IfDefine>时才有效,这会将所有客户端的协议限制为 HTTP/1.1。由于未设置定义,因此默认为第二个块,即启用所有协议。请参阅httpd-DNOHTTP2https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine

相关内容