我有一个很大的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>