端口 443 上的 Apache NameVirtualHost 忽略 ServerAlias

端口 443 上的 Apache NameVirtualHost 忽略 ServerAlias

我在端口 443 上设置了一个基于名称的虚拟主机,这样主机“apple.fruitdomain”上的请求将代理到 apple-app,而主机“orange.fruitdomain”上的请求将代理到 orange-app。这可以正常工作,但我想为每个主机添加一个 ServerAlias,这样主机“apple”上的请求将代理到 apple-app,而主机“orange”上的请求将代理到 orange-app。如果我简单地向虚拟主机添加一个 ServerAlias 指令,它不起作用。ssl.conf 如下:

Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
ServerName apple.fruitdomain
ServerAlias apple
SSLProxyEngine on
ProxyPass /apple-app https://localhost:8181/apple-app
ProxyPassReverse /apple-app https://localhost:8181/apple-app
...
</VirtualHost>
<VirtualHost *:443>
ServerName orange.fruitdomain
ServerAlias orange
SSLProxyEngine on
ProxyPass /orange-app https://localhost:8181/orange-app
ProxyPassReverse /orange-app https://localhost:8181/orange-app
...
</VirtualHost>

有趣的是,如果我进行类似的设置但使用端口 80,则 ServerAlias 可以工作......

答案1

嗯,根据我的测试,在使用 Apache 2.2.15 在端口 443 上使用基于名称的虚拟主机时,ServerAlias 指令被忽略。这可能是由于特殊的 SNI 协议要求(SNI - 维基百科SNI - Apache 维基)。解决方法是创建两个单独的虚拟主机;从我的示例来看,一个虚拟主机的 ServerName 为 orange.fruitdomain,另一个虚拟主机的 ServerName 为 orange。

答案2

为了修复下划线的配置,您需要使用以下命令为“默认”目的创建另一个 VirtualHost:

    ServerName localhost
or
    ServerName your_server_name

请检查 apache httpd 文档(例如)-http://httpd.apache.org/docs/2.2/mod/core.html#servername

ServerName 指令设置服务器用来标识自身的请求方案、主机名和端口。这在创建重定向 URL 时使用。此外,当使用基于名称的虚拟主机时,ServerName 用于(可能与 ServerAlias 结合使用)唯一标识虚拟主机。

答案3

注释掉 listen 443 行,因为监听会自动从 ssl 开始,如果你在监听之前启动它,就会发生冲突。

答案4

相关内容