Apache2 不匹配的虚拟主机
Apache2 bad matching virtualhost
我的虚拟主机有点问题。
我的配置是:
<VirtualHost *:80>
ServerName www.site2.com
DocumentRoot /var/www/domains/site2.com
</VirtualHost>
<VirtualHost *:443>
DocumentRoot /var/www/domains/site1.com
ServerName www.site1.com
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/....
SSLCertificateFile /etc/apache2/ssl/...
SSLCertificateChainFile /etc/apache2/ssl/...
</VirtualHost>
如果您在浏览器中输入以下网址:
https://www.site1.com - OK(匹配 VHost 与 /var/www/domains/site1.com DocumentRoot)
http://www.site2.com - OK(匹配 Vhost 与 /var/www/domains/site2.com DocumentRoot)
但是当我尝试 site2.com 使用 https 协议时 (https://www.site2.com)。 Apache 发现错误的虚拟主机 /var/www/domains/site1.com DocumentRoot..
为什么?
感谢您的帮助。
这是因为您只为 site1 配置了 HTTPS,而没有为 site2 配置。
您需要复制 site1 VirtualHost 配置并将 site2 的信息应用到它,这样它看起来就像下面这样:
<VirtualHost *:80>
ServerName www.site2.com
DocumentRoot /var/www/domains/site2.com
</VirtualHost>
<VirtualHost *:443>
ServerName www.site2.com
DocumentRoot /var/www/domains/site2.com
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/....
SSLCertificateFile /etc/apache2/ssl/...
SSLCertificateChainFile /etc/apache2/ssl/...
</VirtualHost>
<VirtualHost *:443>
ServerName www.site1.com
DocumentRoot /var/www/domains/site1.com
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/....
SSLCertificateFile /etc/apache2/ssl/...
SSLCertificateChainFile /etc/apache2/ssl/...
</VirtualHost>
我假设您的其他网站有一个单独的 SSL 证书,或者只是在测试。
您可能还会 运行 遇到在您的服务器上仅使用一个 IP 地址的情况下通过 HTTPS 托管多个域的问题,您应该按照此处的说明进行操作:http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
这就是虚拟主机在 Apache 中的工作方式。首先检查 TCP 层 IP:PORT 组合的匹配。如果有多个带有 "best match" 的虚拟主机,则会检查主机名(来自 HTTP 主机:header)。
在您的简单情况下,这意味着端口 443 上请求的最佳匹配是单个 *:443 虚拟主机。它永远不会查看更差的匹配项来找到匹配的主机名。
我的虚拟主机有点问题。
我的配置是:
<VirtualHost *:80>
ServerName www.site2.com
DocumentRoot /var/www/domains/site2.com
</VirtualHost>
<VirtualHost *:443>
DocumentRoot /var/www/domains/site1.com
ServerName www.site1.com
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/....
SSLCertificateFile /etc/apache2/ssl/...
SSLCertificateChainFile /etc/apache2/ssl/...
</VirtualHost>
如果您在浏览器中输入以下网址:
https://www.site1.com - OK(匹配 VHost 与 /var/www/domains/site1.com DocumentRoot)
http://www.site2.com - OK(匹配 Vhost 与 /var/www/domains/site2.com DocumentRoot)
但是当我尝试 site2.com 使用 https 协议时 (https://www.site2.com)。 Apache 发现错误的虚拟主机 /var/www/domains/site1.com DocumentRoot..
为什么?
感谢您的帮助。
这是因为您只为 site1 配置了 HTTPS,而没有为 site2 配置。
您需要复制 site1 VirtualHost 配置并将 site2 的信息应用到它,这样它看起来就像下面这样:
<VirtualHost *:80>
ServerName www.site2.com
DocumentRoot /var/www/domains/site2.com
</VirtualHost>
<VirtualHost *:443>
ServerName www.site2.com
DocumentRoot /var/www/domains/site2.com
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/....
SSLCertificateFile /etc/apache2/ssl/...
SSLCertificateChainFile /etc/apache2/ssl/...
</VirtualHost>
<VirtualHost *:443>
ServerName www.site1.com
DocumentRoot /var/www/domains/site1.com
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/....
SSLCertificateFile /etc/apache2/ssl/...
SSLCertificateChainFile /etc/apache2/ssl/...
</VirtualHost>
我假设您的其他网站有一个单独的 SSL 证书,或者只是在测试。
您可能还会 运行 遇到在您的服务器上仅使用一个 IP 地址的情况下通过 HTTPS 托管多个域的问题,您应该按照此处的说明进行操作:http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
这就是虚拟主机在 Apache 中的工作方式。首先检查 TCP 层 IP:PORT 组合的匹配。如果有多个带有 "best match" 的虚拟主机,则会检查主机名(来自 HTTP 主机:header)。
在您的简单情况下,这意味着端口 443 上请求的最佳匹配是单个 *:443 虚拟主机。它永远不会查看更差的匹配项来找到匹配的主机名。