在 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 配置文件中的大量重复。
请参阅此处了解更多详细信息:
答案3
您可以将目录设置放在<Directory>
任何块之外的块中<VirtualHost>
。这将应用于所有虚拟主机,但仅限于指定路径内。