带有 SSL 的 Apache2 我必须复制 VirtualHost 块吗?

带有 SSL 的 Apache2 我必须复制 VirtualHost 块吗?

在 Ubuntu 上的 Apache2 中,我的站点监听 80,现在我想添加 SSL。有没有办法为端口 443 启用 SSLEngine,这样我就不必复制整个 VirtualHost 块了?

当我这样做时:

Listen 80
Listen 443
NameVirtualHost *
<VirtualHost *>
  SSLEngine On
  ... a bunch more lines...
</VirtualHost>

它正在打开端口 80 的 SSLEngine。有没有办法只使用一个 VirtualHost 块,并只打开端口 443 的 SSLEngine?所以我可以做这样的事情吗?

Listen 80
Listen 443
NameVirtualHost *
<VirtualHost *>
   <IfPort 443>
      SSLEngine On
   </IfPort>
   ... a bunch of lines I don't want to copy into another VirutalHost block...
</VirtualHost>

答案1

您无法让一个虚拟主机同时执行 HTTP 和 HTTPS,因为它们是服务于不同协议的独立虚拟主机。相反,您应该将所有通用配置放入一个单独的文件中,然后将该文件包含在域的 SSL 和非 SSL 虚拟主机中。

最小示例:

# /etc/apache2/sites-available/example.com
<VirtualHost *:80>
  Include /etc/apache2/domains/example.com
</VirtualHost>

<VirtualHost 192.0.2.1:443>
  SSLEngine On
  SSLCertificateFile /etc/ssl/example.com_crt
  SSLCertificateKeyFile /etc/ssh/example.com_key

  Include /etc/apache2/domains/example.com
</VirtualHost>

# /etc/apache2/domains/example.com
ServerName example.com
ServerAlias www.example.com

ServerAdmin [email protected]
DocumentRoot /home/example/public_html
ErrorLog /home/example/apache/error.log

答案2

正如我在 stackoverflow 上的另一个问题中提到的那样(https://stackoverflow.com/questions/679383/do-i-have-to-duplicate-the-virtualhost-directives-for-port-80-and-443/52375167#52375167):

除了使用之外的另一种选择Include是使用Macro(这样您可以将其全部保存在一个文件中)。

首先启用宏模块:

a2enmod macro

然后将您共享的内容放入宏中并use从您的虚拟主机中获取:

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin [email protected]
   <DocumentRoot /var/www/example>
      ...
   </DocumentRoot>
</Macro>

<VirtualHost *:80>
  Use SharedStuff
</VirtualHost>

<VirtualHost *:443>
  Use SharedStuff

  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ...
</VirtualHost>

宏还可以接受参数,并在包含的其他文件中定义;因此您可以像使用函数一样使用它们,从而节省 Apache 配置文件中的大量重复。

请参阅此处了解更多详细信息:

https://httpd.apache.org/docs/2.4/mod/mod_macro.html

答案3

您可以将目录设置放在<Directory>任何块之外的块中<VirtualHost>。这将应用于所有虚拟主机,但仅限于指定路径内。

相关内容