125

我们正在为我们的客户托管许多 Web 应用程序。很明显,他们希望使用自己的域来引用这些应用程序,通常他们希望任何输入http://www.customer1.examplehttp://customer1.example访问其 Web 应用程序的用户都可以。

我们面临的情况是,我们需要在不久的将来能够灵活地更改 IP 地址。而且我们不想依赖客户对其域进行 A 记录更改。所以我们认为使用CNAME记录会起作用,但我们发现CNAME记录不适用于根域。

基本上:

customer1.example IN CNAME customer1.mycompanydomain.example //this is invalid as the RFC
www.customer1.example IN CNAME customer1.mycompanydomain.example //this is valid and will work

我们希望能够更改记录的 IP 地址,customer1.mycompanydomain.example我们A的客户将遵循我们可以控制的记录。

在我们的 DNS 中,它看起来像:

customer1.mycompanydomain.example IN A 192.0.2.1

有任何想法吗?

4

9 回答 9

66

这个问题仍然经常出现的原因是,正如你所提到的,在某个地方,某个被认为重要的人写道,RFC 声明在它们前面没有子域的域名是无效的。然而,如果你仔细阅读 RFC,你会发现这并不是它所说的那样。事实上,RFC 1912规定:

不要过度使用 CNAME。在重命名主机时使用它们,但计划摆脱它们(并通知您的用户)。

一些 DNS 主机提供了一种使用自定义记录类型在区域顶点(根域级别,对于裸域名)获得类似 CNAME 的功能的方法。此类记录包括,例如:

  • DNSimple 的别名
  • DNS 上的 ANAME 变得简单
  • easyDNS 上的 ANAME
  • CloudFlare 的 CNAME

对于每个提供商,设置都相似:将您的顶级域的 ALIAS 或 ANAME 条目指向 example.domain.com,就像使用 CNAME 记录一样。根据 DNS 提供商,空值或 @Name 值标识区域顶点。

ALIAS 或 ANAME 或 @example.domain.com。

如果您的 DNS 提供商不支持这种记录类型,并且您无法切换到支持的记录类型,则需要使用子域重定向,这并不难,具体取决于需要执行此操作的协议或服务器软件.

我强烈不同意仅由“业余管理员”或此类想法完成的说法。这是一个简单的“名称及其服务需要做什么?” 交易,然后调整您的 DNS 配置以满足这些愿望;如果您的主要服务是 Web 和电子邮件,我看不出任何有效的理由说明永久删除 CNAME 会出现问题。毕竟,谁会喜欢 @subdomain.domain.org 而不是 @domain.org ?如果您已经设置好协议本身,谁需要“www”?假设使用根域名无效是不合逻辑的。

于 2014-03-26T11:41:19.067 回答
52

从技术上讲,对根记录进行 CNAME 并不违反 RFC,但确实有局限性,这意味着不建议这样做。

通常你的根记录会有多个条目。比如说,3 个用于您的名称服务器,然后一个用于 IP 地址。

根据 RFC:

如果 CNAME RR 出现在节点上,则不应出现其他数据;

并且根据 IETF 的“常见 DNS 操作和配置错误”文档:

经验不足的管理员通常会尝试这样做,这是让您的域名也成为主机的明显方式。但是,像 BIND 这样的 DNS 服务器会看到 CNAME 并拒绝为该名称添加任何其他资源。由于不允许其他记录与 CNAME 共存,因此忽略 NS 条目。因此,podunk.xx 域中的所有主机也会被忽略!

参考:

于 2009-04-16T20:43:32.680 回答
4

我不知道他们是如何摆脱它的,或者他们可能会产生什么负面影响,但我正在使用 Hover.com 来托管我的一些域,并且最近将我的域的顶点设置为那里的 CNAME。他们的 DNS 编辑工具根本没有抱怨,我的域很高兴通过分配的 CNAME 解析。

这是 Dig 向我展示的该域(实际域混淆为 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
于 2014-02-13T08:25:48.493 回答
3

我的公司为许多客户做同样的事情,我们为他们托管一个网站,尽管在我们的例子中它是 xyz.company.com 而不是 www.company.com。我们确实让他们在 xyz.company.com 上设置 A 记录,以指向我们分配给他们的 IP 地址。

至于如何应对 I​​P 地址的变化,我认为没有完美的解决方案。一些想法是:

  • 使用 NAT 或 IP 负载平衡器并为您的客户提供属于它的 IP 地址。如果 Web 服务器的 IP 地址需要更改,您可以在 NAT 或负载均衡器上进行更新,

  • 还提供 DNS 托管服务,让您的客户与您一起托管他们的域,以便您能够更新 A 记录,

  • 让您的客户将他们的 A 记录设置到一个主 Web 服务器,并对每个客户的 Web 请求使用 HTTP 重定向。

于 2009-03-18T03:27:50.410 回答
3

Sipwiz 是正确的,正确执行此操作的唯一方法是 HTTP 和 DNS 混合方法。我的注册商是 Tucows 的转售商,他们提供根域转发作为免费增值服务。

如果您的域是 blah.com,他们会询问您要将域转发到哪里,然后您输入 www.blah.com。他们将 A 记录分配给他们的 apache 服务器并自动将 blah.com 添加为 DNS 虚拟主机。vhost 响应 HTTP 302 错误,将它们重定向到正确的 URL。脚本/设置很简单,可以由低端处理,否则会被报废硬件。

运行以下命令作为示例: curl -v eclecticengineers.com

于 2009-03-18T04:43:58.387 回答
3

您必须在外部域的末尾加上一个句点,这样它就不会认为您的意思是 customer1.mycompanydomain.com.localdomain;

所以只需改变:

customer1.com IN CNAME customer1.mycompanydomain.com

customer1.com IN CNAME customer1.mycompanydomain.com.
于 2014-02-23T17:30:30.393 回答
0

一种解决方案是为 www 子域创建 CNAME,然后将根域转发到您的 www 子域。第一步在 DNS 设置中完成,第二步在转发域部分完成。

参考:https ://www.tachyonstemplates.com/2018/google-domains-forward-root/ 。

于 2021-12-31T06:24:12.247 回答
-2

我看到 readytocloud.com 托管在 Apache 2.2 上。

在 Apache 中有一种更简单、更有效的方法可以将非 www 站点重定向到 www 站点。

将以下重写规则添加到 Apache 配置(在虚拟主机内部或外部。没关系):

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule ^/$ http://www.readytocloud.com/ [R=301,L]

或者,如果您想要从非 www 站点到 www 站点的 URL 的一对一映射,请使用以下重写规则:

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 个域和近 4,000 个重定向,但是,服务器上的负载徘徊在 0.10 - 0.20 左右。

于 2009-06-17T21:23:21.777 回答
-8

感谢 sipwiz 和 MrEvil。我们开发了一个 PHP 脚本,它将解析用户输入的 URL 并粘贴www到它的顶部。(例如,如果客户进入kiragiannis.com,那么它将重定向到www.kiragiannis.com)。所以我们的客户指向他们的根(例如记录我们的网络重定向器在哪里),然后customer1.com指向我们管理的真实记录。Awww CNAMEA

如果您对未来的我们感兴趣,请在代码下方。

<?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}");
?>
于 2009-03-20T20:04:50.300 回答