我尝试在除 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 时都会抛出“此处不允许使用协议”错误。
我在 Debian 9.6 上运行 Apache 2.4.25。
答案1
我怀疑你无法做你想做的事,因为当你弄清楚客户端正在使用的浏览器时,你已经协商了协议并收到了请求;用户代理作为请求标头提交。
第一个块仅在您将二进制文件作为额外参数传递<IfDefine>
时才有效,这会将所有客户端的协议限制为 HTTP/1.1。由于未设置定义,因此默认为第二个块,即启用所有协议。请参阅httpd
-DNOHTTP2
https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine