H2Upgrade
该指令的文件httpd 文档关于 HTTP/2 说
这应该在某个部分内使用,
<VirtualHost>
以启用该虚拟主机到 HTTP/2 的升级。
我有两个虚拟主机,都只监听纯 HTTP。这是我的 httpd 配置:
<VirtualHost *:80>
Protocols h2c http/1.1 http/1.0
H2Upgrade on
DocumentRoot /var/www/
</VirtualHost>
<VirtualHost *:80>
Protocols h2c http/1.1 http/1.0
H2Upgrade off
ServerName test.mydomain.loc
DocumentRoot /var/www/apps
</VirtualHost>
测试curl
表明,通过改变主机名,可以选择正确的虚拟主机(很容易区分它们,因为它们具有不同的文档根目录)。
curl --http2 -vLo- 'http://test.mydomain.loc/test.html'
但是,只有第一个(默认)虚拟主机中的指令才H2Upgrade
用于两个虚拟主机。在第二个虚拟主机中,该指令完全无用。
我想H2Upgrade
在第一个虚拟主机上打开,在第二个虚拟主机上关闭。该怎么做?
顺便说一句,把它们转过来也行不通。另外,这只是一个展示案例,通常它们是 中的两个独立文件/etc/apache2/sites-enabled
。
带升级功能的 HTTP/2 以通常的 HTTP/1.1 标头开头,并带有一个用于请求升级的附加字段:
GET /test.html HTTP/1.1
Host: test.mydomain.loc
User-Agent: curl/7.64.0
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
H2Upgrade
服务器应该根据此选择正确的虚拟主机,然后简单地忽略升级请求(就像在第一个虚拟主机中关闭时一样)。
答案1
我看到 mod_http2 有一个新版本允许更精细的 H2Upgrade 范围:
H2Upgrade 可以根据目录/位置进行配置。已添加测试用例。
它没有明确说明这可以根据 VirtualHost 定义,但值得一试。它尚未包含在 Apache 版本中(我猜是 2.4.39 版),因此需要单独下载和编译才能使用它。有关如何执行此操作的详细信息,请参阅此博客文章:https://www.tunetheweb.com/performance/http2/