57

DNS A 记录要求将 IP 地址硬编码到应用程序的 DNS 配置中

... Heroku 建议避免使用. Heroku 提出了两种解决方法:

...在顶点使用支持类似 CNAME 功能的 DNS 提供程序,并使用子域重定向。

我的问题围绕后一个选项(因为 DreamHost AFAIK 不支持前者):

是否可以从根(即顶点或“裸”)域重定向到 HTTPS 请求的“www”子域,而不会出现浏览器错误?

Heroku 不这么认为:

...需要 SSL 加密的应用程序应在根域上使用 ALIAS/ANAME 配置。当通过 SSL(即https://example.com)请求根域时,子域重定向将导致浏览器错误。

...但我希望这是一个不完整(或不正确)的陈述。

澄清更新:

从顶点重定向到“www”的真正问题是https://example.com直接在浏览器中输入会引发证书警告。当然,这是一个边缘案例,但不是一个小案例。

解决方案更新:

我用DNSimple解决了这个问题。(甚至不必转移我的域名!)

我相信 easyDNS 提供了类似的功能,但惊讶地发现大多数其他域托管公司没有。

4

3 回答 3

111

这里有两个独立但相互依赖的间接级别需要考虑。第一个是 DNS 名称最终解析到的 IP 地址。第二个是该 IP 地址上的服务器的作用。

请记住,当您在浏览器中键入 URL 时,首先发生的是 DNS 查找。通常,这是由操作系统处理的,而不是浏览器本身。

所以你的浏览器会问操作系统,“ example.com的地址是什么?” 操作系统将查找记录,如果它得到 a CNAME,将查找记录,直到找到一条A记录。操作系统然后用一个答案来响应浏览器。

然后,您的浏览器会打开到该 IP 地址的 TCP 连接:

  • 如果是 http:// URL,它会连接到端口 80,然后发出 HTTP 请求。
  • 如果是 http s :// URL,它会连接到端口 443,建立 TLS/SSL 连接(这意味着验证证书),然后通过安全通道发出 HTTP 请求。

只有在这一点上才能发生 HTTP 重定向。浏览器发送请求 ( GET /,服务器可以用 301 响应任何其他 URL。

了解注册商提供的“子域重定向”服务只不过是发出 301 的常规 HTTP 服务器。当您选择注册商的重定向选项时,他们只是将A您域的顶点记录设置到他们控制的服务器上,该服务器会告诉浏览器转到www.example.com

由于大多数注册商不允许您将 SSL 证书上传到他们的重定向服务器,因此浏览器无法与服务器建立必要的安全连接,因此它们从不发出 HTTP 请求。因此,对https​://example.com的请求会失败。

那么为什么你不能只是CNAME顶点呢? 这是被禁止的。

域系统使用规范名称 ( CNAME) RR [Record Resource] 来提供这样的功能。RR将其所有者名称标识为别名,并在 RR 的部分中 CNAME指定相应的规范名称。如果节点上存在 RR,则不应存在其他数据;这可确保规范名称及其别名的数据不能不同。此规则还确保可以使用缓存而无需与权威服务器检查其他 RR 类型。RDATACNAMECNAME

规范要求CNAME记录是给定(子)域的唯一记录。SOA这与在顶点上有记录的要求不一致。(有一些努力改变规范以允许CNAMESOA共存,但仍然有许多损坏的 SMTP 实现会被CNAME域上的混淆。)

您可以通过以下选项让 SSL 在顶点上运行:

  • 在重定向服务器上使用支持 SSL 的第三方服务。你可能会为此付出代价。 这是一项服务。推荐这条路线,因为它使您无法控制可靠性,并要求您将 SSL 证书的密钥交给可能值得或可能不值得信赖的人。
  • 运行您自己的重定向服务器。由于 apex 需要A记录,因此您需要一个静态 IP,而 Heroku 和 AWS 的 ELB 等服务不提供该 IP。因此,如果您处于云环境中,那么保证可靠性将非常困难(如果不是不可能的话)。从好的方面来说,您保留对 SSL 密钥的控制权。
  • 使用允许您设置别名的 DNS 主机。将别名指向您的 Heroku 域/ELB/其他。这很可能是最好的选择。

别名在技术上不是一种 DNS 记录。相反,它是 DNS 主机端的一种特殊配置,它A从另一个查找的结果中返回一条记录。换句话说:

  1. 您的操作系统向您的 DNS 主机发出对example.com的 DNS 请求。
  2. 您的 DNS 主机读取内部别名配置,并为该域发出 DNS 请求。因此,如果您为example.herokuapp.com设置了别名,它将查找A该域的记录。
  3. DNS 主机返回一个简单的A记录,其中包含从别名查找中获得的 IP。

使用别名记录,您可以将您的顶点指向您的www域所在的同一个云负载均衡器CNAME假设您已经在www域上设置了 SSL ,那么裸域就可以正常工作。此时,您可以选择是您的应用发出重定向,还是直接通过裸域提供您的内容。

于 2013-05-14T01:27:12.827 回答
2

您需要一个保护 www.example.com 和 example.com 的证书。

于 2017-08-14T05:17:49.627 回答
2

注意:我没有用 Heroku 应用程序尝试过这个。我仍然在这里分享这个解决方案,因为这是第一个显示“从裸域重定向到 www 版本”搜索的 stackoverflow 页面。它可能会帮助其他正在寻找通用重定向答案的人。

我已成功将裸域重定向到 www 版本。此外,我还使用合成记录中的谷歌域 DNS 设置将 HTTP 版本重定向到 HTTPS 版本。

  1. 删除 DNS 中“@”的任何“A”记录。
  2. 添加带有 subdomain = '@' 的合成记录,并将其重定向到您网站的 www 版本。
  3. 添加后,编辑同一条记录并将默认的“ http://www.example.com ”更改为“ https://www.example.com ”。请注意此处 http 中的“s”。单击保存。
  4. 而已。您的重定向现在由 DNS 设置处理。

此处记录了详细步骤: https ://www.am22tech.com/redirect-naked-domain-www-http-https-google-domains/

于 2017-12-30T20:36:01.153 回答