访问已禁用 SSL 的域的 https 版本会显示不同的页面



我使用Webmin/virtualmin,我有几个虚拟主机:

Virtual Server  Any         80  Automatic   /var/www/html
Virtual Server  Any         80  website1.nl /home/website1/public_html
Virtual Server  XX.XX.XXX.X 443 website1.nl /home/website1/public_html
Virtual Server  Any         80  website2.nl /home/website2/public_html

网站1 启用了 SSL,但网站 2 未启用。

每当我去https://website2.nl它都会触发website1.nl:443的幽灵。这是因为网站 2 没有自己的 443 虚拟主机。

我试图添加这个:

Virtual Server  XX.XX.XXX.X         443 Automatic   /var/www/html

但它永远不会触发...

我想阻止这种情况发生。它应该是 404 或至少应该包含默认的根/var/www/html

如果服务器上只有 1 个 IP:

  • <VirtualHost *:80>(== 任意,端口 80(会将请求与 http://IP
  • <VirtualHost XXX.XXX.XXX.XXX:443>会将请求与 http://XXX.XXX.XXX.XXX 匹配
  • 但是,如果 XXX.XXX.XXX.XXX 是== IP,这就是您遇到问题的地方。

如果两个域位于同一 IP 上,则对端口 :443 的请求将被 Apache 理解为转到唯一匹配的<VirtualHost>,即 XXX.XXX.XXX.XXX:443,而不考虑所涉及的域名。<VirtualHost>匹配和证书协商发生在识别域名之前

即使有很多,Apache也会采用配置中的第一个(自上而下(,因为SSL握手是在请求的域名完成之前完成的。

如果服务器上有 2 个 IP

为您的域设置单独的 IP。 通过IP分离,Apache可以知道你想要哪个站点。 所以:

<VirtualHost IP1:80>
ServerName website1.nl
[...]
</VirtualHost>
<VirtualHost IP2:443>
ServerName website2.nl
[...]
</Virtualhost>

这样,对 https://IP1/的请求将被 Apache 拒绝,因为没有 VirtualHost 匹配。 但是,设置第二个IP并不总是可能的。

部分解决方案

在这里,我使用您的<VirtualHost>设置。所以

<VirtualHost IP1:80>
ServerName website1.nl
[...]
</VirtualHost>
<VirtualHost XXX.XXX.XXX.XXX:443>
ServerName website2.nl
[...]
</VirtualHost>
where XXX.XXX.XXX.XXX == IP1

您可以在 *:443<VirtualHost>中设置重写规则,该规则表示将 website1.nl 请求重定向回 IP1:80。

RewriteCond %{HTTP_HOST} website1.nl
RewriteRule (.*) http://IP1:80/$1

这样做的一个问题是,您的SSL证书很可能是为 website2.nl 设置的,因此浏览器会注意到请求的域名 website1.nl,因此与证书不匹配。 这就是为什么它是一个部分解决方案。您可以将证书设置为涵盖两个域,从而消除此问题,具体取决于您对证书创建的控制级别(完全灵活性与否(。

最新更新