![apache https 适用于其他 http vhosts](https://linux22.com/image/676078/apache%20https%20%E9%80%82%E7%94%A8%E4%BA%8E%E5%85%B6%E4%BB%96%20http%20vhosts%20.png)
我搜索了很多,也尝试了很多方法,但仍然找不到问题。
我在 ubuntu server 12.04 lts 上安装了 apache 2.2.22 服务器。我有多个 http 虚拟主机和 2 个 https 虚拟主机。一切正常,但奇怪的是,如果我在浏览器中输入我的一个 http 站点,而使用 https,它会将我重定向到实际的 https 站点。这非常尴尬,我真的不知道是什么原因造成的。
有没有人也遇到过这种情况?你能帮忙吗?提前谢谢
答案1
目前尚不清楚您在问什么,但有两个潜在的问题:
1)Apache 将尝试找到最佳匹配的 vhost,如果没有其他匹配项,则默认使用第一个与 IP 地址和端口匹配的 vhost,这有时会给不了解这一点的人带来意想不到的结果。
因此,如果您有以下内容:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.example1.com
DocumentRoot /www/example1/htdocs
</VirtualHost>
<VirtualHost *:80>
ServerName www.example2.com
DocumentRoot /www/example2/htdocs
</VirtualHost>
<VirtualHost *:443>
ServerName www.example1.com
DocumentRoot /www/example1/htdocs
</VirtualHost>
你可能会惊讶于当你尝试去https://www.example2.com。您可能会认为它要么会出错,要么会通过 https 为 example2 站点提供服务,但实际上 Apache 所做的是在端口 443 上寻找匹配项,当它找不到精确匹配项时,它会默认使用第一个匹配项,因此提供与https://www.example1.com。
2)或者如果你的意思是你有这个配置:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.example1.com
DocumentRoot /www/example1/htdocs
</VirtualHost>
<VirtualHost *:80>
ServerName www.example2.com
DocumentRoot /www/example2/htdocs
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.example1.com
SSLCertificateFile /ssl/cert1.crt
DocumentRoot /www/example1/htdocs
</VirtualHost>
<VirtualHost *:443>
ServerName www.example2.com
SSLCertificateFile /ssl/cert2.crt
DocumentRoot /www/example2/htdocs
</VirtualHost>
那么在这种情况下你会希望https://www.example2.com会工作。
问题是,通常 https 请求最初是向 IP 地址发出的,而不传递服务器名称,因此 Apache 不知道您想要哪一个,因此它再次假定第一个并传回 cert1.crt 来设置会话,这可能是不正确的。设置 https 会话后,它会获取 ServerName 并可以正确路由请求。
https 的一项更新名为 SNI(服务器名称指示),允许将 ServerName 与初始请求一起传递,以便使用正确的证书,但这取决于您的服务器使用的是 OpenSSL 0.9.8f 或更高版本以及您使用的浏览器(特别是不支持此功能的 Windows XP 上的 IE)。如果这是一个问题,有解决方法(假设它涵盖两个域,则对两个域使用相同的证书,或者对每个域使用不同的 IP 地址)。
答案2
HTTP 和 HTTPS 是不同端口上的不同协议。如果您使用 HTTPS,Apache 将仅“看到”https 虚拟主机。如果您使用 HTTP,Apache 将仅“看到”http 虚拟主机。如果您希望将一个重写为另一个,则需要明确执行此操作。