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

Jak*_*ake 14 ssl virtualhost apache-2.2

我有一个相当大的 VirtualHost 定义,我不想复制它,这样站点也将通过 HTTPS 运行。

这是我想要做的:

<VirtualHost *>
    ServerName example.com

    <If port=443>
        SSLEngine on
        SSLCertificateFile ...
        SSLCertificateKeyFile ...
        SSLCertificateChainFile ...
    </If>

    (other config)

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?
我是否缺少其他不复制配置的方法?

Tyr*_*ael 12

Apache(2.2) 的当前稳定版本没有该功能,但 2.4 确实有IF 指令

您现在必须创建两个 VirtualHosts,但您可以通过环境或 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>
Run Code Online (Sandbox Code Playgroud)

ps:SNI 将在 IPv6 适配前几年成为主流。假设您在受支持的操作系统上,所有主流浏览器都已经支持它。

编辑:正如 fooquency 发现的那样,您不能将 SSLEngine On 放在 If 块中,所以我的答案是错误的。

  • 尝试将 `SSLEngine On` 放在 `&lt;If&gt;` 中会导致 `SSLEngine not allowed here`,因此可悲的是,此答​​案开头的建议用例似乎不可能。这似乎是因为要求“在此配置部分中只能使用支持目录上下文的指令”。[(ref)](http://httpd.apache.org/docs/2.4/mod/core.html#if) 和 `SSLEngine` 是 `server config, virtual host` [(ref)](http:// httpd.apache.org/docs/current/mod/mod_ssl.html#sslengine),而不是目录。 (10认同)