我有一个Apache 2.0 httpd实例,我想要同时承载HTTP和HTTPS。 他们共享相同的IP地址,HTTP将在端口80和HTTPS在端口443(标准)。 我有两个域www.example.com和secure.example.com都指向该IP地址。
现在的问题是:我只想要www.example.com的HTTPstream量以及只有HTTPSstream量才能访问secure.example.com。 这意味着没有HTTPS到www.example.com和没有HTTP secure.example.com。
我的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中托pipe多个域,所以没有问题。 我只是希望用户被拒绝使用HTTPS访问www.example.com,反之亦然secure.example.com。
这甚至可能没有一个单独的IP别名?
解决HTTP到secure.example.com很容易。 您只需创build一个额外的虚拟主机来指向HTTPS:
<VirutalHost 10.0.0.1:80> ServerName secure.example.com Redirect / https://secure.example.com/ </VirtualHost>
解决HTTPS http://www.example.com是困难的。 问题是,通常你不能用HTTPS做基于名字的虚拟主机。 原因是在Apache知道你要连接的主机之前build立了SSL连接,所以不知道要发送哪个SSL证书,所以必须发送它所知道的第一个SSL证书。 结果是,如果您尝试使用基于名称的SSL,则会在每个虚拟主机上发送除一个之外的错误证书,并且浏览器将向用户显示错误。 您可以使用* .example.com的通配符证书或使用带有“替代主题名称”的证书来解决此问题。 不幸的是,这些证书花费更多的钱,你可能会发现支持补丁更模糊的客户。
您可以添加一个类似的HTTPS虚拟主机,您可以使用HTTP:
<VirtualHost 10.0.0.1:443> ServerName www.example.com Redirect / http://www.example.com/ </VirtualHost>
如果你解决了SSL问题,这将是没有错误的工作。 如果你没有,那么客户端应该得到关于主机名不符合证书的错误消息,但是应该redirect到http。
我只是添加新的虚拟主机与redirect
<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>