我有一个相当大的 VirtualHost 定义,我不想重复,只是为了让网站也能通过 HTTPS 运行。
这是我想要做的:
<VirtualHost *>
ServerName example.com
<If port=443>
SSLEngine on
SSLCertificateFile ...
SSLCertificateKeyFile ...
SSLCertificateChainFile ...
</If>
(other config)
</VirtualHost>
有什么办法可以做到这一点吗?
我是否错过了其他不重复配置的方法?
答案1
Apache 的当前稳定版本(2.2)没有该功能,但 2.4 有IF 指令。
现在您必须创建两个 VirtualHost,但您可以通过环境或 apache 全局变量设置一些内容,并在虚拟主机配置中使用它(例如设置 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 适配之前。所有主流浏览器都已支持 IPv6(假设您使用的是受支持的操作系统)。
编辑:正如 fooquency 发现的那样,您不能将 SSLEngine On 放到 If 块中,所以我的答案是错误的。
答案2
不。您可以将大多数内容移至全局配置并在 VirtualHost 中继承它。
答案3
另一个问题已经回答了这个问题。使用 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>
答案4
对于 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 的虚拟主机一起使用?”