我使用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,因此与证书不匹配。 这就是为什么它是一个部分解决方案。您可以将证书设置为涵盖两个域,从而消除此问题,具体取决于您对证书创建的控制级别(完全灵活性与否(。