如何克服根域CNAME限制?
我们为我们的客户托pipe了许多Web应用程序。 很明显,他们希望使用自己的域来引用这些应用程序,通常他们希望任何键入http://www.customer1.com或http://customer1.com的用户都转到其Web应用程序。
我们面临的情况是,我们需要在不久的将来有更改IP地址的灵活性。 我们不希望依靠客户在其域名上进行Alogging更改。 所以我们认为使用CNAMES是可行的,但是我们发现CNAMEs不适用于根域。
基本上:
customer1.com IN CNAME customer1.mycompanydomain.com //this is invalid as the RFC www.customer1.com IN CNAME customer1.mycompanydomain.com //this is valid and will work
我们希望能够更改customer1.mycompanydomain.com的IP地址或Alogging,我们的客户将遵循我们控制的logging。
在我们的DNS中,它将如下所示:
customer1.mycompanydomain.com IN A 5.5.5.1
有任何想法吗?
这个问题还是经常出现的原因,就像你提到的那样,有人认为有人认为重要的是在RFC前面指出没有子域名的域名是无效的。 然而,如果你仔细阅读RFC,你会发现这不完全是它所说的。 实际上, RFC 1912指出:
不要过度使用CNAME。 重命名主机时使用它们,但计划摆脱它们 (并通知您的用户)。
某些DNS主机提供了一种使用自定义loggingtypes在区域顶点(根域级别,裸域名称)获取类似CNAME的function的方法。 这样的logging包括,例如:
- ALIAS在DNSimple
- DNS的简易名称
- easyDNS的ANAME
- CloudFlare的CNAME
对于每个提供程序,设置都是类似的:将apex域的ALIAS或ANAME条目指向example.domain.com,就像使用CNAMElogging一样。 取决于DNS提供商,空的或@名称值标识区域顶点。
ALIAS或ANAME或@ example.domain.com。
如果您的DNS提供商不支持这种loggingtypes,并且您无法切换到这样做,您将需要使用子域redirect,这并不困难,这取决于需要执行的协议或服务器软件。
我强烈反对只有“业余pipe理员”或这样的想法才能做到这一点。 这是一个简单的“名称和服务需要做什么?” 处理,然后调整您的DNSconfiguration以满足这些愿望; 如果您的主要服务是networking和电子邮件,我不会看到任何有效的理由,为什么放弃CNAME的好处是有问题的。 毕竟,谁更喜欢@ subdomain.domain.org通过@ domain.org? 如果您已经使用协议本身,谁需要“www”? 假定使用根域名将是无效的是不合逻辑的。 http://no-www.org/
CNAME对根logging在技术上不是针对RFC,但有一定的局限性,这意味着这是一个不推荐的做法。
通常你的根logging将有多个条目。 说,3你的名字服务器,然后一个IP地址。
根据RFC:
如果CNAME RR存在于一个节点上,则不应该存在其他数据。
和每个IETF的“常见DNS操作和configuration错误”文档:
这是经验不足的pipe理员经常尝试的一种明显的方式,可以让您的域名也成为主机。 但是,像BIND这样的DNS服务器会看到CNAME,并拒绝为该名称添加任何其他资源。 由于不允许其他logging与CNAME共存,所以NS条目将被忽略。 因此,podunk.xx域中的所有主机也被忽略!
参考文献:
我不知道他们是怎么逃避的,也不知道他们可能会有什么不利的副作用,但是我使用Hover.com来托pipe我的一些域名,并且最近在那里设置了我的域名顶点作为CNAME。 他们的DNS编辑工具根本没有抱怨,我的域名通过分配的CNAME高兴地解决。
这是什么挖显示我这个域(实际域混淆为mydomain.com):
; <<>> DiG 9.8.3-P1 <<>> mydomain.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2056 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;mydomain.com. IN A ;; ANSWER SECTION: mydomain.com. 394 IN CNAME myapp.parseapp.com. myapp.parseapp.com. 300 IN CNAME parseapp.com. parseapp.com. 60 IN A 54.243.93.102
你必须把一段时间放在外部域的末尾,所以它不认为你的意思是customer1.mycompanydomain.com.localdomain;
所以只需改变:
customer1.com IN CNAME customer1.mycompanydomain.com
至
customer1.com IN CNAME customer1.mycompanydomain.com.
Sipwiz是正确的唯一方法正确做到这一点是HTTP和DNS混合的方法。 我的注册商是Tucows的代理商,他们提供根域转发作为免费增值服务。
如果你的域名是blah.com,他们会问你你想把域名转发到哪里,然后inputwww.blah.com。 他们将Alogging分配给他们的apache服务器,并自动将blah.com添加为DNS vhost。 虚拟主机响应HTTP 302错误redirect到正确的URL。 脚本/设置很简单,可以通过低端来处理,否则会被废弃的硬件。
运行以下命令作为示例:curl -v eclecticengineers.com
我们公司为一些为我们提供网站的客户做同样的事情,虽然在我们的案例中是xyz.company.com而不是www.company.com。 我们确实让他们在xyz.company.com上设置Alogging来指向我们分配的IP地址。
至于如何应对IP地址的变化,我不认为有一个完美的解决scheme。 一些想法是:
-
使用NAT或IP负载平衡器,并为您的客户提供属于它的IP地址。 如果Web服务器的IP地址需要更改,您可以在NAT或负载平衡器上进行更新,
-
提供一个DNS托pipe服务,让您的客户托pipe他们的域名,这样你就可以更新Alogging,
-
让您的客户将Alogging设置为一个主要的Web服务器,并为每个客户的Web请求使用HTTPredirect。
感谢sipwiz和MrEvil。 我们开发了一个PHP脚本,它将parsing用户input的URL并将www
粘贴到其顶部。 (例如,如果客户进入kiragiannis.com ,那么它将redirect到www.kiragiannis.com )。 因此,我们的客户将他们的根(例如, customer1.com
指向我们的networkingredirect器的A
logging),然后将www
CNAME
指向我们pipe理的真实A
logging。
如果您对未来感兴趣,请在代码下方input。
<?php $url = strtolower($_SERVER["HTTP_HOST"]); if(strpos($url, "//") !== false) { // remove http:// $url = substr($url, strpos($url, "//") + 2); } $urlPagePath = ""; if(strpos($url, "/") !== false) { // store post-domain page path to append later $urlPagePath = substr($url, strpos($url, "/")); $url = substr($url, 0, strpos($url,"/")); } $urlLast = substr($url, strrpos($url, ".")); $url = substr($url, 0, strrpos($url, ".")); if(strpos($url, ".") !== false) { // get rid of subdomain(s) $url = substr($url, strrpos($url, ".") + 1); } $url = "http://www." . $url . $urlLast . $urlPagePath; header( "Location:{$url}"); ?>
我看到readytocloud.com托pipe在Apache 2.2上。
有一个更简单和更有效的方法来将非www站点redirect到Apache中的www站点。
将以下重写规则添加到Apacheconfiguration中(在虚拟主机内部或外部,无关紧要):
RewriteCond %{HTTP_HOST} ^readytocloud.com [NC] RewriteRule ^/$ http://www.readytocloud.com/ [R=301,L]
或者,如果您希望从非www网站到万维网站点的1对1映射,请遵循以下重写规则:
RewriteCond %{HTTP_HOST} ^readytocloud.com [NC] RewriteRule (.*) http://www.readytocloud.com$1 [R=301,L]
请注意,mod_rewrite模块需要加载这个工作。 幸运的是,readytocloud.com正在一个CentOS盒子上运行,它默认加载了mod_rewrite。
我们有一个运行Apache 2.2的客户端服务器,只有不到3,000个域名和近4000个redirect,但是服务器的负载徘徊在0.10 – 0.20左右。