我有一个 Apache 2.0 httpd 实例,我想同时托管 HTTP 和 HTTPS。它们共享同一个 IP 地址,HTTP 将在端口 80 上运行,HTTPS 将在端口 443 上运行(标准)。我有 2 个域 www.example.com 和 secure.example.com,它们都指向该 IP 地址。
现在的问题是:我只想让 HTTP 流量流向 www.example.com,让 HTTPS 流量流向 secure.example.com。这意味着 www.example.com 不能使用 HTTPS,secure.example.com 也不能使用 HTTP。
我的 httpd.conf 看起来像
ServerName www.example.com
Listen 10.0.0.1:80
Listen 10.0.0.1:443
NameVirtualHost 10.0.0.1:80
NameVirtualHost 10.0.0.1:443
<VirtualHost 10.0.0.1:80>
ServerName www.example.com
</VirtualHost>
<VirtualHost 10.0.0.1:443>
ServerName secure.example.com
SSLEnable # ... and other SSL stuff
</VirtualHost>
现在的情况是,我可以使用 HTTP 和 HTTPS 访问这两个域名。我查了一下基于端口的虚拟主机和基于名称的虚拟主机,似乎我所拥有的应该可以工作。我没有尝试在 SSL 中托管多个域,所以这没有问题。我只是希望用户被拒绝使用 HTTPS 访问 www.example.com,反之亦然。
如果没有单独的 IP 别名,这可能吗?
答案1
解决 HTTP 到 secure.example.com 的问题很简单。你只需创建一个额外的虚拟主机来指向 HTTPS:
<VirutalHost 10.0.0.1:80>
ServerName secure.example.com
Redirect / https://secure.example.com/
</VirtualHost>
解决 www.example.com 的 HTTPS 问题比较困难。问题在于,通常您无法使用 HTTPS 进行基于名称的虚拟托管。原因是 SSL 连接是在 Apache 知道您要尝试连接到哪个主机之前建立的,因此不知道要发送哪个 SSL 证书,因此必须发送它知道的第一个证书。结果是,如果您尝试进行基于名称的 SSL,您将在除一个虚拟主机之外的每个虚拟主机上收到错误的证书,并且浏览器将向用户显示错误。您可以使用 *.example.com 的通配符证书或使用带有主题备用名称的证书来解决这个问题。不幸的是,这些证书花费更多,并且您可能会发现对更不知名的客户端的支持不完善。
您可以为 HTTPS 添加与 HTTP 类似的虚拟主机:
<VirtualHost 10.0.0.1:443>
ServerName www.example.com
Redirect / http://www.example.com/
</VirtualHost>
如果您解决了 SSL 问题,此操作将正常运行,不会出现错误。如果没有,则客户端应该会收到有关主机名与证书不匹配的错误消息,但随后应该重定向到 http。
答案2
我只需添加带有重定向的新虚拟主机
<VirtualHost 10.0.0.1:443>
ServerName www.example.com
Redirect / https://secure.example.com/
</VirtualHost>
<VirutalHost 10.0.0.1:80>
ServerName secure.example.com
Redirect / http://www.example.com/
</VirtualHost>