端口443上的Apache NameVirtualHost忽略ServerAlias

我已经在端口443上设置了一个基于名称的虚拟主机设置,这样主机“apple.fruitdomain”上的请求代理到apple-app,主机“orange.fruitdomain”上的请求代理到orange-app。 这是工作,但我想添加一个ServerAlias为每个这样的主机上的请求'苹果'代理苹果应用程序和主机'橙'的请求代理橙色的应用程序。 如果我只是将一个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工程…

那么,从我的testing看来,当在Apache2.2.15的端口443上使用基于名字的虚拟主机时,ServerAlias指令会被忽略。 这可能是由于特殊的SNI协议要求( SNI – Wikipedia ; SNI – Apache Wiki )。 解决方法是创build两个独立的虚拟主机; 从我的例子中,将有ServerName的orange.fruitdomain和其他将有ServerName橙色。

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

  ServerName localhost or ServerName your_server_name 

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

ServerName指令设置服务器用来标识自身的请求scheme,主机名和端口。 这在创buildredirectURL时使用。 此外,在使用基于名称的虚拟主机时,使用ServerName(可能与ServerAlias一起)来唯一标识虚拟主机。

注意听443行,因为听开始与ssl automaticaly,如果你之前启动它会看到冲突。