我可以在Apache conf中的同一个VirtualHost中定义HTTP和HTTPS吗?

我有一个很大的VirtualHost定义,我不想重复,所以网站也将通过HTTPS运行。

这是我想要做的:

<VirtualHost *> ServerName example.com <If port=443> SSLEngine on SSLCertificateFile ... SSLCertificateKeyFile ... SSLCertificateChainFile ... </If> (other config) </VirtualHost> 

有没有办法做到这一点?
我是否缺less一些不重复configuration的其他方法?

目前稳定版本的Apache(2.2)没有这个function,但是2.4有IF指令 。

你现在必须创build两个虚拟主机,但是你可以通过环境或者apache全局variables来设置一些东西,并且在虚拟主机configuration中使用它(例如设置文档)。 这样,如果你想改变,你可以做只有一行修改。

当然,你可以使用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:在IPv6适应之前,SNI将成为主stream。 所有的主stream浏览器都支持它已经假设你在一个支持的操作系统。

编辑:如发现fooquency你不能把SSLEngine在一个If块,所以我的回答是错误的。

不,你可以将大部分东西移到全局configuration中,并在VirtualHost中inheritance它。

对于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

向下search“为什么我不能在基于名称/非IP的虚拟主机上使用SSL?”

这在另一个问题上得到了回答。 使用一个包含语句。 对我来说就像一个魅力:

在同一个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>