Answers:
Apache(2.2)的当前稳定版本不具有该功能,但是2.4确实具有IF指令。
您现在必须创建两个VirtualHosts,但是您可以通过环境或apache全局变量设置一些内容,并在您的virtualhost配置中使用它(例如,设置documentroot)。这样,如果您要更改,只需一行修改即可完成。
当然,您可以使用include来执行以下操作:
<VirtualHost *:80>
include /etc/apache2/vhost.conf.d/site1
</VirtualHost>
<VirtualHost *:443>
include /etc/apache2/vhost.conf.d/site1
include /etc/apache2/vhost.conf.d/site1-ssl
</VirtualHost>
ps:SNI将是IPv6适应之前的主流年份。假设您使用的是受支持的操作系统,那么所有主流浏览器都已支持它。
编辑:愚蠢发现您不能将SSLEngine放在If块上,所以我的答案是错误的。
这在另一个问题中得到了回答。使用Include语句。对我来说就像一个魅力:
在同一VirtualHost上服务http(端口80)和https(端口443)
# Acme Co
<VirtualHost 192.168.56.101:80>
Include /usr/local/apache2/conf/main-acme.conf
</VirtualHost>
###* SSL
<VirtualHost 192.168.56.101:443>
Include /usr/local/apache2/conf/main-acme.conf
SSLEngine On
</VirtualHost>
对于SSL虚拟主机,您必须使用第二个端口ala
<VirtualHost *:443>
ServerName abc.com
</VirtualHost>
<VirtualHost *:4443>
Servername def.com
</VirtualHost>
否则您必须使用单独的IP
<VirtualHost 192.168.0.1:443>
ServerName abc.com
</VirtualHost>
<VirtualHost 192.168.0.2:443>
Servername def.com
</VirtualHost>
Apache SSL文档http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html中确实有很好的解释
向下搜索“为什么不能将SSL与基于名称/基于非IP的虚拟主机一起使用?”
SSLEngine On
在<If>
将给予SSLEngine not allowed here
,所以建议用例在这个答案的开始可悲的是没有出现成为可能。这似乎是因为“在此配置部分中只能使用支持目录上下文的指令”的要求。(ref)并且SSLEngine
是server config, virtual host
(ref),不是目录。