如何为指向Heroku应用程序的顶点域(无www)设置DNS?


97

我已经在我的Heroku应用中添加了自定义域,并且可以使用www.domain.com

我也需要知道如何设置域而不www解析该应用程序。

这是我当前的DNS设置:

$TTL 86400
@   IN SOA ns1.first-ns.de. postmaster.robot.first-ns.de. (
    2013041500   ; serial
    14400        ; refresh
    1800         ; retry
    604800       ; expire
    86400 )      ; minimum

@                        IN NS      robotns3.second-ns.com.
@                        IN NS      robotns2.second-ns.de.
@                        IN NS      ns1.first-ns.de.

@                        IN A       88.198.38.XXX
localhost                IN A       127.0.0.1
mail                     IN A       88.198.38.XXX
ftp                      IN CNAME   www
imap                     IN CNAME   www
loopback                 IN CNAME   localhost
pop                      IN CNAME   www
relay                    IN CNAME   www
smtp                     IN CNAME   www
www                      IN CNAME   appname.herokuapp.com.
@                        IN MX 10   mail

什么是正确的设置,使用这样既example.comwww.example.com将正确地指向我的Heroku应用程序?


顺便说一句,您的ftp / pop / smtp设置似乎都错了,因为它指向的是www,而后者却指向不执行ftp / pop / smtp的heroku。
2013年

Answers:


145

(注意:根域,基域,顶点域都是相同的东西。可互换地用于google-foo。)

传统上,要指向顶点域,您将使用指向服务器IP的A记录。对于像Heroku这样的云平台,该解决方案无法扩展,也不可行,在该云平台中,多个且经常更改的后端负责响应请求。

对于子域(如www.example.com),您可以使用指向的CNAME记录your-app-name.herokuapp.com。从那里开始,Heroku管理后面的动态A记录,your-app-name.herokuapp.com以便它们始终是最新的。不幸的是,DNS规范不允许区域顶点(基本域)上的CNAME记录。(例如,MX记录将中断,因为CNAME将首先跟随其到达目标。)

回到根域,简单通用的解决方案是根本不使用它们。作为备用措施,某些DNS提供商会为您设置HTTP重定向。在这种情况下,请将其设置example.com为HTTP重定向到www.example.com

一些DNS提供商提出了自定义解决方案,这些解决方案允许在区域顶点上执行类似CNAME的行为。据我所知,我们有DNSimple的ALIAS记录DNS Made Easy的ANAME记录;两者的行为相似。

使用这些,您可以将记录设置为(使用zonefile表示法,即使您可能会在其Web用户界面上执行此操作):

@   IN ALIAS your-app-name.herokuapp.com.
www IN CNAME your-app-name.herokuapp.com.

请记住,@这里是根域(example.com)的简写。另外请注意,尾随点在区域文件和某些Web用户界面中都很重要。

也可以看看:

备注:

  • 亚马逊的Route 53也具有ALIAS记录类型,但由于它只能指向AWS内部,因此它受到一定限制。目前,我不建议将其用于Heroku设置。

  • 有些人将DNS提供者与域名注册商混淆,因为与同时提供这两者的公司有些重叠。请注意,要将您的DNS切换到上述提供商之一,您只需要使用当前的域名注册商来更新您的域名服务器记录。您不需要转移您的域名注册。


1

3
+1代表dnsimple。他们努力简化与云提供商的合作是我决定转而选择他们的一个重要因素。
Subfuzion

1
@kch您知道我可以创建类似于BIND中DNSimple的ALIAS行为的DNS记录类型的任何方法吗?
2013年

1
不要以为可以。这是一个自定义功能。
2013年

2
CloudFlare还通过所谓的CNAME扁平化提供了此功能。他们会针对您在根目录中创建的CNAME记录自动执行此操作,但是如果您与他们联系并提出要求,他们将在整个区域为所有CNAME记录启用该记录。
AdrianFrühwirth2014年

4

要将顶点/根目录/裸域指向Heroku托管的应用程序,您需要使用支持类似CNAME记录(通常称为ALIAS或ANAME记录)的DNS提供程序。目前,Heroku 建议

无论选择哪种记录,您的记录都将如下所示:

记录: ALIASANAME

名称:空或@

目标: example.com.herokudns.com.

这就是您所需要的。


但是,同时解析www版本和非www版本的SEO都是不好的。一个应该指向另一个作为规范URL。如何决定这样做取决于您是否使用HTTPS。如果不是这样,您可能应该是因为Heroku现在自动为您处理SSL证书,并且免费为运行在付费dyno上的所有应用程序免费提供SSL证书

如果你不使用HTTPS,你可以设置有指向名称大多数DNS提供商301重定向记录wwwhttp://example.com

如果您正在使用HTTPS,你很可能需要处理在应用层重定向。如果您想知道为什么,请查看这些简短内容长期的解释,但基本上,因为你的DNS提供商或其他URL转发服务没有,并且不应该有,你的SSL证书和私钥,他们不能到HTTPS响应请求您的域。

要在应用程序级别处理重定向,您需要:

  • 将您的主机名和www主机名都添加到Heroku应用程序中(heroku domains:add example.comheroku domains:add www.example.com
  • 设置您的SSL证书
  • 如上所述,使用ALIAS或ANAME记录将您的最高域名记录指向Heroku
  • 添加名称www指向的CNAME记录www.example.com.herokudns.com.
  • 然后在您的应用程序中,301将所有www请求重定向到非www URL(这是在Django中执行此操作的示例
  • 同样在您的应用程序中,您可能应该将所有HTTP请求重定向到HTTPS(例如,在Django中设置SECURE_SSL_REDIRECTTrue

看看这篇文章从DNSimple更多。



2

不允许为该域创建CNAME记录,因为CNAME是覆盖所有数据类型的别名功能(无论客户端是否查找MX,NS或SOA记录)。CNAME也总是引用新名称,而不是ip地址,因此单行实际上存在两个错误

@                        IN CNAME   88.198.38.XXX

将CNAME更改为A记录应该可以使其工作,只要您使用的ip地址是适用于Heroku应用程序的IP地址。

DNS中使简单domain.com名称在浏览器中起作用的唯一正确方法是将域指向具有A记录的IP地址。


好的,但是如何找到我的IP?通过主机appname.herokuapp.com/www.domain.com,我得到的IP是这样的:107.20.162.205(没有类似的Heroku App)
mrks 2013年

1
该IP是要使用的IP。您只是无法使用IP地址在浏览器中进行测试,因为Heroku需要知道您要使用的应用程序的名称。只需在DNS中设置A记录并使用than进行测试,Heroku就会看到您正在使用的名称,并且一切都会很好!
krisku

好的,但是每次在“ host appname.herokuapp.com”之后都得到另一个IP。
mrks 13-4-16

2
host app-name.herokuapp.com结果是动态的。如果对它们进行硬编码,则您的应用最终将停止运行。请参阅其他评论中推荐的ANAME / CNAME解决方案。
2013年

1
您需要一些具有不变IP地址的Web服务器,该服务器可以执行从domain.com-> www.domain.com的HTTP重定向,并将domain.com指向该IP地址。然后,您可以将www.domain.com的CNAME指向实际的heroku应用。
krisku
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.