如何在 Apache 中使用单个配置文件配置多个虚拟主机?

如何在 Apache 中使用单个配置文件配置多个虚拟主机?

系统

Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

问题

我应该如何使用带重定向的 SSL 在 Apache 中使用单个配置文件配置多个虚拟主机?

下面的配置中需要什么和不需要什么?例如是否可以Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/hosek/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/hosek/privkey.pem仅设置为文件开头?对于所有vhosts?

可以将整个配置放在一个文件中吗,特别是一个文件VirtualHost?我现在有 2 个文件,一个用于80,另一个用于443

我的 s 的示例vhost

no-ssl.conf文件。

<VirtualHost *:80>
ServerName www.thehatmakers.cz
ServerAlias thehatmakers.cz
RewriteCond %{HTTP_HOST} ^(thehatmakers.cz) [NC]
RewriteRule ^(.*)$ http://www.thehatmakers.cz$1 [R=301,L]
RewriteCond %{SERVER_NAME} =www.thehatmakers.cz
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:80>
ServerName www.obrazduse.cz
ServerAlias obrazduse.cz
RewriteCond %{HTTP_HOST} ^(obrazduse.cz) [NC]
RewriteRule ^(.*)$ http://www.obrazduse.cz$1 [R=301,L]
RewriteCond %{SERVER_NAME} =www.obrazduse.cz
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

ssl.conf文件。

<VirtualHost *:443>
ServerName www.thehatmakers.cz
ServerAlias thehatmakers.cz
RewriteCond %{HTTP_HOST} ^(thehatmakers.cz) [NC]
RewriteRule ^(.*)$ http://www.thehatmakers.cz$1 [R=301,L]
DocumentRoot /var/www/html/thehatmakers
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/hosek/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hosek/privkey.pem
</VirtualHost>

<VirtualHost *:443>
ServerName www.obrazduse.cz
ServerAlias obrazduse.cz
RewriteCond %{HTTP_HOST} ^(obrazduse.cz) [NC]
RewriteRule ^(.*)$ http://www.obrazduse.cz$1 [R=301,L]
DocumentRoot /var/www/html/obrazduse
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/hosek/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hosek/privkey.pem
</VirtualHost>

谢谢。

更新

如果无法使用 1 个 VirtualHost,那么这个配置怎么样?有没有更短的方法可以做到这一点?可以用于RedirectSSL 吗?正如我对配置的评论*:443?我可以使用Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/hosek/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/hosek/privkey.pem 外部VirtualHost配置吗?那么谷歌呢,这种重定向可以吗?我对所有域都使用 1 个证书,可以吗?

<VirtualHost *:80>
ServerName www.thehatmakers.cz
ServerAlias thehatmakers.cz
Redirect / https://www.thehatmakers.cz
</VirtualHost>

<VirtualHost *:443>
ServerName www.thehatmakers.cz
ServerAlias thehatmakers.cz
#Redirect / https://www.thehatmakers.cz
RewriteCond %{HTTP_HOST} ^(thehatmakers.cz) [NC]
RewriteRule ^(.*)$ https://www.thehatmakers.cz$1 [R=301,L]
DocumentRoot /var/www/html/thehatmakers
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/hosek/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hosek/privkey.pem
</VirtualHost>

谢谢。

答案1

除了拟议的复制以下是针对该问题的一些具体答案:

如何设置正在ServerAlias使用的 HTTPS 虚拟主机。

如果您在 HTTPS/SSL 虚拟主机中使用ServerAlias指令,则需要为所有域名颁发证书。使用时,letsencrypt您需要添加几个-d选项:

sudo letsencrypt --apache .... -d www.example.com -d example.com

所有证书都将放在同一个证书文件中。

是否可以将整个配置放在一个文件中,尤其是一个 VirtualHost?我现在有 2 个文件,一个用于 80,另一个用于 443。

你可以将所有 VirtualHost 的定义放在一个文件中,这样就可以很容易地同时启用和禁用它们。但是无法配置一个 VirtualHost 来监听两个端口。

Redirect那么Rewrite在 ssl 配置中怎么样?

根据 Apache2 针对此类情况的文档,最好使用指令Redirect而不是Rewrite规则。请注意,如果要重定向https://example.com到,则需要创建两个单独的 VirtualHosts https://www.example.com。所有相关的 VirtualHosts 都可以使用以上述方式生成的相同证书文件。

每个虚拟主机将负责不同的ServerName,例如:ServerName example.com分别负责第一个, ServerName www.example.com第二个,等等。注意ServerAlias必须删除该指令。

如果一切按预期运行,您可以继续使用Rewrite规则 - 这取决于您的决定。如果您使用Redirect指令,不要忘记末尾的斜线目标域名!下面是使用该Redirect指令的 HTTPS VirtualHost 的示例。

<VirtualHost *:443>
    ServerName thehatmakers.cz
    Redirect permanent "/" "https://www.thehatmakers.cz/"

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/hosek/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/hosek/privkey.pem
</VirtualHost>
  • 对于这个 VirtualHost,您不需要任何其他东西。

  • 该关键字permanent将指示客户端的浏览器下次自动执行此重定向。

  • Redirect= HTTP 302

  • Redirect permanent= HTTP 301

相关内容