为什么虚拟主机内的指令被视为全局的?

为什么虚拟主机内的指令被视为全局的?

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/

相关内容