![具有多个域的一台 Apache 服务器上的 SSL 和 ServerAlias](https://linux22.com/image/577728/%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%E5%9F%9F%E7%9A%84%E4%B8%80%E5%8F%B0%20Apache%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84%20SSL%20%E5%92%8C%20ServerAlias.png)
我有一个虚拟服务器,我想将两个域指向它,两个域都指向不同的站点。
例如,example1.com
去/var/www/example1
。example2.com
去/var/www/example2
。
我可以使用 VirtualHosts 很好地做到这一点:
<VirtualHost *:80>
ServerName example1.com
DocumentRoot "/var/www/example1"
</VirtualHost>
<VirtualHost *:80>
ServerName example2.com
DocumentRoot "/var/www/example2"
</VirtualHost>
我的第一个问题与前导有关www
。为了支持www
,我刚刚添加了一个ServerAlias
:
<VirtualHost *:80>
ServerName example1.com
ServerAlias www.example1.com
DocumentRoot "/var/www/example1"
</VirtualHost>
这是最好的方法吗?
我的第二个问题涉及 SSL。我也希望example2.com
通过 SSL 进行访问:https://example2.com
。我已经颁发了证书等,但我如何在我的httpd.conf
文件中实现这一点?目前我有一个临时的解决方法。我刚刚将服务器的主程序更改DocumentRoot
为指向此/var/www/example2
。我了解 SSL 位于不同的端口上,因此它不会被 VirtualHost 定义解释,因此我已将此作为快速解决方法。但是,我想知道最好的方法是什么?
答案1
是的 - ServerAlias 是实现该目标的标准方法。有时,最好选择 www.myserver.com 作为“最优先”身份,并使用“myserver.com”作为别名,但除非您在某个时候规范化(将链接转换为首选链接)URL,否则这实际上没有什么不同。
2.
编辑:我似乎误解了 OP 的问题,所以这基本上是不相关的
简短回答 (用于在一台 Apache 服务器上托管多个 SSL 站点)
最简单的解决方案是基于 IP 的虚拟主机...支持所有浏览器 - 向您的 ISP 索取第二个 IP 地址。因此,每个 SSL 证书都有 1 个 IP。请参阅下面的示例配置。
服务器名称指示 - 不是 XP 或旧版 Safari,也不是旧版 Android - 仅适用于 1 个 IP -http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
长答案(我确实被这个答案迷住了...;-) 这里是有关 SSL 和名称虚拟主机的快速入门信息....
基于名称的虚拟主机,是一种根据客户端(即 Web 浏览器等)提供的“主机”标头在网站之间共享 Web 服务器的策略。
这是 HTTP 1.1 扩展,要使用它,apache 会读取请求的内容并解析标头,即它看起来像这样;
GET /index.htm HTTP/1.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0
Host: www.google.co.uk <-- apache checks this value
然而TLS 握手用于 SSL 连接,服务器在发送主机头之前使用 SSL 证书中的“通用名称”字段来识别自己。
因此(使用传统的...SSL v1、旧浏览器等、Windows XP)每个 IP 地址只能有一个 SSL 身份,因为服务器做的第一件事就是将自己标识为 www.amazon.com,之后就无法更改...
基本上,正常情况下的区别是这样的http://myserver.com要求
client: hello server
server: hello client
client: please give me web XXX
server: here is websiteXXX
但对于 https:// 请求来说,它更像这样;
client: hello server
server: I am website XXX
client: ok, go ahead and give me website XXX
server: here is websiteXXX
因此,基本上,对于“支持所有浏览器”,包括老旧浏览器的解决方案,您需要向您的 ISP 索取另一个公共 IP 地址然后将第二个虚拟主机绑定到第二个 IP 而不是第一个......
但是也有一些替代方案,允许在单个 IP 地址上使用多个 SSL 身份,并且可在大多数现代浏览器上使用,例如 SNI 或通配符证书。
- 通配符证书,不适用于这种特殊情况,因为服务器名称是域级别的,例如 badger.com 和 monkey.com,而不是 badger.server.com 和 monkey.server.com
然而服务器名称指示在握手过程中,告诉服务器您想要哪个主机,服务器可以提供正确的证书。看起来服务器将恢复使用默认证书,因此,当您拥有一个“主要” SSL 站点和一个不太重要的站点(您可以接受一些用户请求的丢失)时,这可能是一个很好的策略。
基本上,添加 SSL 虚拟主机的指令是类似的,只是您添加的是普通的虚拟主机,而不是 NameVirtualHosts。
#if not done elsewhere in httpd.conf incldue these
Listen 443
LoadModule ssl_module modules/mod_ssl.so
#this does work for wildcard SSL certs like *.myserver.com (and SNI???)
NameVirtualHost *:443
<VirtualHost 1.1.1.1:443>
SSLEngine On
ServerName address1.com
DocumentRoot /var/www/adderss2
SSLCertificateFile /etc/httpd/conf/domaina_ssl/zimbra.zmb.moc.crt
</VirtualHost>
<VirtualHost 1.1.1.2:443>
SSLEngine on
ServerName address2.com
DocumentRoot /var/www/adderss2
SSLCertificateFile /etc/apache2/ssl/apache.pem
</VirtualHost>
答案2
您的 www ServerAlias 完全正常;不用担心。如果您想要更高级一些,可以设置 RewriteRule 以将流量从 www.example.com 引导到 example.com,反之亦然。至于 SSL 支持,请为您的 :80 和 :443 虚拟主机使用单独的 VirtualHost 定义。