我有一台服务器(Ubuntu + Apache),我们在其中托管一个应用程序,客户可以在其中创建自己的子域名 - 即基本上是通配符子域名。
我们有一位客户希望将他们自己的域名 (www.client.com) 指向我们服务器上他唯一的子域名 (client.app.com)。这应该透明地发生,这样当有人输入 www.client.com 时,网址仍显示 www.client.com,但一切在 client.app.com 上透明地运行
在他的 DNS 中,他是否应该创建指向我们的 IP 地址的 A 记录,还是指向 client.app.com 的 cname?
在任何一种情况下我们需要创建的虚拟主机有什么区别吗?
答案1
在他的 DNS 中,他是否应该创建指向我们的 IP 地址的 A 记录,还是指向 client.app.com 的 cname?
他应该使用指向 client.app.com 的 CNAME。这样做有很多原因,但最好的原因可能是因为这意味着如果服务器的 IP 地址发生变化,则需要进行的更改更少:只需要更新 client.app.com 的条目,其他所有通过 CNAME 指向该条目的内容都会自动更新。
其他原因包括无法拥有与 MX 记录相同的名称 A 记录,正如另一位发帖者提到的那样;以及主机应该只有一个“真实名称”(A 记录)的一般原理,而指向同一主机的其他记录应该是别名(CNAME)。当然,当您有一个指向多个 IP 和多个主机的单个 A 记录时,这种原理就不成立了(但客户端使用 CNAMES 的另一个好理由是:如果您的服务变得流行,您需要通过负载平衡到提供相同服务的其他主机来扩展它,您希望您的客户从中受益而无需进行任何更改)。(当然,有很多方法可以进行负载平衡和扩展,您也可以轻松选择一种不依赖于 DNS 的方法,但这取决于您的实现。)
在任何一种情况下我们需要创建的虚拟主机有什么区别吗?
无论您选择哪种 DNS 方法,您都需要确保 apache 配置为接受其他名称。
这样,当有人输入 www.client.com 时,网址仍显示 www.client.com,但一切在 client.app.com 上透明地运行
当然,您需要自己浏览 apache 文档来确认以下内容,但我可以想到两种方法来做到这一点:
UseCanonicalName Off
ServerAlias
每个里面都有VirtualHost
入口:UseCanonicalName Off <VirtualHost *:80> ServerName www.client.com ServerAlias client.app.com DocumentRoot /www/client </VirtualHost>
使用多个
ServerName
和VirtualHost
条目:<VirtualHost *:80> ServerName www.client.com DocumentRoot /www/client </VirtualHost> <VirtualHost *:80> ServerName client.app.com DocumentRoot /www/client </VirtualHost>
请记住,无论使用哪种方法,您都必须确保 html 和任何相关脚本都在做“正确的事情”,以便正确生成所需行为的 URL。
这里还有许多很好的例子和有趣的讨论:http://httpd.apache.org/docs/2.4/vhosts/mass.html关于该主题。