我最近为我的主网站获取了 SSL 证书 (https://wemarsh.com/)。它运行良好,我甚至设置了 .htaccess 规则,以便该站点上的所有流量都经过加密。(我正在运行 Apache。)
但是,我在同一台服务器上还有其他网站,使用相同的 IP 地址。例如,我有一个博客 (http://gallivant.wemarsh.com/)。只要我连接到非加密版本,它就能很好地工作。我不想为这个网站启用加密,因为我知道我现有的证书不包括该子域,而且我不想为此支付额外的 IP 地址。因此,如果用户输入 http://,一切都很好,但如果用户输入 https://(无论出于何种原因),就会出现一个警告,说该网站是冒名顶替者(正如预期的那样,因为证书是错误的)。但如果用户仍然点击继续,它会将他们带到主站点,而不是子域上的博客。这种情况在实践中很少遇到,但我觉得正确的行为是发出警告,然后继续前往正确的“冒名顶替者”网站。或者如果它完全失败,我可能就没事了。
我了解一些问题。首先,我知道 SSL 操作发生在 Apache 收到请求之前,这就是为什么通常不能在同一个 IP 地址上拥有多个证书的原因。它似乎还阻止我仅使用 .htaccess 规则将所有人转发到网站的 http:// 版本(与我在主网站上所做的相反)。
因此,我理解发生的事情是这样的:SSL 通过向浏览器返回错误的证书来处理证书请求。浏览器犹豫不决,但允许我们继续。然后 Apache 不知道请求的 URL 是什么,但知道它在端口 443 上,因此它返回主站点。浏览器认为它获得了子域博客,因此它仍然显示该 URL。
我当前主站点的虚拟主机如下:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.wemarsh.com
ServerAlias wemarsh.com
DirectoryIndex index.html
DocumentRoot redacted
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.wemarsh.com
ServerAlias wemarsh.com
SSLEngine on
SSLCertificateFile redacted
SSLCertificateKeyFile redacted
SSLCertificateChainFile redacted
SSLCACertificateFile redacted
DirectoryIndex index.html
DocumentRoot redacted
</VirtualHost>
我当前子域名博客的虚拟主机如下:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName gallivant.wemarsh.com
DirectoryIndex index.php
DocumentRoot redacted
</VirtualHost>
我还尝试在子域的虚拟主机中定义端口 443,但没有成功。
我能做到我想做的事情吗?有人有解决方案吗?将来当我向服务器添加额外的 IP 地址和另一个证书时,情况会变得更加复杂,所以在提出建议时请记住这一点。
我认为共享主机提供商必须以某种方式做到这一点,否则所有非 https 网站都会崩溃,对吗?
(注意:我有意没有链接到 gallivant 的 https 版本。我最不希望看到的就是 Google 将人们引导到这个错误上,因此请避免在您的回复中链接该错误。)
提前致谢!
答案1
您无法绕过用户收到的警告,因为您是对的 - 无法确定域名是什么,直到为时已晚。它仅适用于 TLS(现代浏览器支持 TLS,但旧浏览器不支持,而且大多数自动爬虫和 api 脚本也不了解 TLS)。
您唯一能做的修复是在用户通过警告页面后 - 检查主机名是否正确,如果不正确,则重定向到正确的非 ssl(或 ssl)域。
最好的解决办法当然是获取 SSL 的单独 IP,这样它就不会与其他域发生冲突,但正如您所指出的,您不想这样做。