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

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

我有一个相当大的 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 的虚拟主机一起使用?”

相关内容