![Apache 配置的子域名问题](https://linux22.com/image/544982/Apache%20%E9%85%8D%E7%BD%AE%E7%9A%84%E5%AD%90%E5%9F%9F%E5%90%8D%E9%97%AE%E9%A2%98.png)
我正在尝试实现以下目标:
http:// site.com -> 主站点(重写 www.site.com,不带 www)
https:// predeploy.site.com -> 第二个站点(受密码保护和 SSL)
https:// site.com -> 连接被拒绝
http://predeploy.site.com-> 连接被拒绝
子域名的 DNS 是通过 A 记录而不是 CNAME 完成的,因为它们显然是 Linode 名称服务器的首选方法。site.com 和 predeploy.site.com 都解析为同一个 IP。
我设置了两个虚拟主机:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName site.com
ServerAlias www.site.com
DocumentRoot /var/www/site.com
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
ServerName predeploy.site.com
DocumentRoot /var/www/predeploy.site.com
SSLEngine on
... # Basic auth and SSL stuff, which works
</VirtualHost>
问题是 https:// site.com 提供第二个站点(与 https:// predeploy.site.com 相同,并且需要身份验证),而 http:// predeploy.site.com 提供主站点(与 http:// site.com 相同)。我认为这意味着虚拟主机错误。我该如何修复它们?
答案1
它的行为就像您已配置它一样。让我解释一下:
SSL 基于端口,除非您使用 UCC 证书,否则 SSL 下实际上不存在“NameVirtualHost”。这意味着,如果您对两个站点使用相同的 IP 地址,它将始终显示您配置的 SSL 站点,因为它绑定在端口上。
您没有为端口 80 的 predeploy.site.com 创建 VirtualHost,这意味着它将默认为第一个。如果您希望将不使用 SSL 的 predeploy 重定向到使用 SSL 的 predeploy,则需要在端口 80 上为其创建一个虚拟主机,然后在该虚拟主机内进行重定向。