访问禁用 ssl 的域的 https 版本会显示不同的页面
Posted
技术标签:
【中文标题】访问禁用 ssl 的域的 https 版本会显示不同的页面【英文标题】:Visiting https version of domain which has ssl disabled shows a different page 【发布时间】:2018-11-21 22:09:36 【问题描述】:我使用 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
的虚拟主机。这是因为 website2 没有自己的 443 vhost。
我尝试添加这个:
Virtual Server XX.XX.XXX.X 443 Automatic /var/www/html
但它永远不会触发......
我想阻止这种情况发生。它应该是 404 或者至少应该包含默认根 /var/www/html
。
【问题讨论】:
【参考方案1】:如果服务器上只有 1 个 IP:
<VirtualHost *:80>
(== Any, port 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>
中设置一个 RewriteRule,表示将对 website1.nl 的请求重定向回 IP1:80。
RewriteCond %HTTP_HOST website1.nl
RewriteRule (.*) http://IP1:80/$1
其中一个问题是您的 SSL 证书很可能是为 website2.nl 设置的,因此浏览器会注意到请求的域名是 website1.nl,因此与证书不匹配。这就是为什么它是部分解决方案。您可以设置证书以涵盖两个域,从而消除此问题,这取决于您对证书创建的控制级别(是否完全灵活)。
【讨论】:
以上是关于访问禁用 ssl 的域的 https 版本会显示不同的页面的主要内容,如果未能解决你的问题,请参考以下文章