如何为指向 Heroku 应用程序的***域(无 www)设置 DNS?
Posted
技术标签:
【中文标题】如何为指向 Heroku 应用程序的***域(无 www)设置 DNS?【英文标题】:How do I set up DNS for an apex domain (no www) pointing to a Heroku app? 【发布时间】:2013-04-07 23:44:20 【问题描述】:我已经在我的 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.com
和www.example.com
都能正确指向我的 Heroku 应用程序?
【问题讨论】:
btw 看起来你的 ftp/pop/smtp 设置都是错误的,因为它指向 www,它指向不做 ftp/pop/smtp 的 heroku。 另一种解决方案***.com/a/11494197/176877 【参考方案1】:(注意:root、base、apex 域都是一样的。可以互换使用 google-foo。)
传统上,要指向您的***域,您需要使用指向服务器 IP 的 A 记录。对于 Heroku 这样的云平台而言,该解决方案无法扩展且不可行,因为其中多个且频繁更改的后端负责响应请求。
对于子域(如www.example.com
),您可以使用指向your-app-name.herokuapp.com
的CNAME 记录。从那时起,Heroku 管理 your-app-name.herokuapp.com
后面的动态 A 记录,以便它们始终是最新的。不幸的是,DNS 规范不允许区域顶点(基域)上的 CNAME 记录。 (例如,MX 记录会中断,因为 CNAME 将首先跟随其目标。)
回到根域,简单通用的解决方案是根本不使用它们。作为一种后备措施,一些 DNS 提供商会为您设置 HTTP 重定向。在这种情况下,请将其设置为 example.com
是指向 www.example.com
的 HTTP 重定向。
一些 DNS 提供商提出了自定义解决方案,允许在区域顶点上进行类似 CNAME 的行为。据我所知,我们有DNSimple's ALIAS record 和DNS Made Easy's ANAME record;两者的行为相似。
使用这些,您可以将记录设置为(使用 zonefile 表示法,即使您可能会在他们的网络用户界面上执行此操作):
@ IN ALIAS your-app-name.herokuapp.com.
www IN CNAME your-app-name.herokuapp.com.
请记住 @
这里是根域的简写 (example.com
)。另外请注意,在区域文件和某些 Web 用户界面中,尾随点很重要。
另见:
Doing DNS right with Heroku Avoiding Naked Domains and DNS A-records备注:
Amazon 的 Route 53 也有一个 ALIAS 记录类型,但它有一些限制,因为它只能指向 AWS 内部。目前我不建议将其用于 Heroku 设置。
有些人将 DNS 提供商与域名注册商混为一谈,因为与提供这两者的公司有些重叠。请注意,要将您的 DNS 切换到上述提供商之一,您只需使用当前的域注册商更新您的名称服务器记录。您无需转移您的域名注册。
【讨论】:
另见Heroku's Dev Center +1 用于提及 dnsimple。他们努力让与云提供商合作变得更容易,这是我决定转向他们的一个重要因素。 @kch 你知道我有什么方法可以创建一个 DNS 记录类型,其行为类似于 DNSimple 在 BIND 中的别名吗? 不要认为你可以。这是一项自定义功能。 CloudFlare 也通过他们称之为CNAME flattening 的方式提供此功能。他们会自动为您在根目录创建的 CNAME 记录执行此操作,但如果您与他们联系并要求,他们将在您的整个区域为所有 CNAME 记录启用它。【参考方案2】:要将您的 apex/root/naked 域指向 Heroku 托管的应用程序,您需要使用支持 CNAME 类记录(通常称为 ALIAS 或 ANAME 记录)的 DNS 提供商。目前 Heroku recommends:
ALIAS at DNSimple ANAME at DNS Made Easy ANAME at easyDNS ALIAS at PointDNS CNAME at CloudFlare无论您选择哪一个,您的记录将如下所示:
记录: ALIAS
或 ANAME
姓名:为空或@
目标:example.com.herokudns.com.
这就是你所需要的。
但是,not good for SEO 同时解析 www 版本和非 www 版本。一个应该指向另一个作为规范 URL。您如何决定这样做取决于您是否使用 HTTPS。如果你不是,你可能现在应该成为 Heroku handles SSL certificates for you 自动免费为所有在付费测功机上运行的应用程序。
如果您不使用 HTTPS,您可以设置一个 301 重定向记录,大多数 DNS 提供商将名称 www
指向 http://example.com
。
如果您正在使用 HTTPS,您很可能需要在应用程序级别处理重定向。如果您想知道原因,请查看这些 short 和 long 解释,但基本上因为您的 DNS 提供商或其他 URL 转发服务没有也不应该拥有您的 SSL 证书和私钥,所以他们可以t 响应您的域的 HTTPS 请求。
要在应用程序级别处理重定向,您需要:
将您的 apex 和 www 主机名添加到 Heroku 应用程序(heroku domains:add example.com
和 heroku domains:add www.example.com
)
Set up your SSL certificates
如上所述,使用 ALIAS 或 ANAME 记录将您的***域记录指向 Heroku
添加名称为www
指向www.example.com.herokudns.com.
的CNAME 记录
然后在您的应用程序中,301 将任何 www 请求重定向到非 www URL(如何在 Django 中执行此操作的here's an example)
同样在您的应用程序中,您可能应该将所有 HTTP 请求重定向到 HTTPS(例如,in Django 将 SECURE_SSL_REDIRECT
设置为 True
)
查看来自 DNSimple 的 this post 了解更多信息。
【讨论】:
【参考方案3】:我现在使用 Google Apps(用于电子邮件)和 Heroku 作为网络服务器。我正在使用 Google Apps 301 永久重定向功能将裸域重定向到 WWW.your_domain.com
您可以在此处找到分步说明 https://***.com/a/20115583/1440255
【讨论】:
【参考方案4】:您不能拥有域的 CNAME 记录,因为 CNAME 是一种别名功能,涵盖所有数据类型(无论客户端查找 MX、NS 还是 SOA 记录)。 CNAME 也总是指一个新名称,而不是 IP 地址,因此实际上在一行中有 两个错误
@ IN CNAME 88.198.38.XXX
将 CNAME 更改为 A 记录应该可以使其正常工作,前提是您使用的 ip 地址对于您的 Heroku 应用程序是正确的。
在 DNS 中使简单的domain.com
名称在浏览器中工作的唯一正确方法是将域指向具有 A 记录的 IP 地址。
【讨论】:
好的,但是我怎样才能找到我的 IP?通过主机 appname.herokuapp.com/www.domain.com 我只得到一个这样的 IP:107.20.162.205(没有这样的 Heroku 应用程序) 该IP是要使用的。您只是无法在浏览器中使用 IP 地址进行测试,因为 Heroku 需要知道您尝试使用的应用程序的名称。只需在 DNS 中设置 A 记录并使用 than 进行测试,Heroku 就会看到您正在使用的名称,一切都应该很好! 好的,但是每次在“host appname.herokuapp.com”之后我都会得到另一个IP。host app-name.herokuapp.com
结果是动态的。如果你硬编码这些,你的应用程序最终会刹车。请参阅另一条评论中推荐的 ANAME/CNAME 解决方案。
您需要一些具有不变 IP 地址的网络服务器,可以执行从 domain.com -> www.domain.com 的 HTTP 重定向,并将 domain.com 指向该 IP 地址。然后你可以让 www.domain.com 的 CNAME 指向真正的 heroku 应用程序。以上是关于如何为指向 Heroku 应用程序的***域(无 www)设置 DNS?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Heroku 应用程序配置带有 SSL 的 Amazon Route
如何为指向两个不同域的一个 Laravel 应用程序设置不同的语言环境?
如何将子域指向 Heroku 应用程序,将根域指向另一个 Heroku 应用程序?
我如何将Squarespace域指向我的Heroku应用程序?