如何为指向 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.comwww.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

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

记录: ALIASANAME

姓名:为空或@

目标: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.comheroku 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应用程序?

如何为 Python 使用 Heroku buildpack ffmpeg?

如何为成功部署的 React 应用程序修复 Heroku 应用程序错误