这里有两个独立但相互依赖的间接级别需要考虑。第一个是 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 类型。RDATA
CNAME
CNAME
规范要求CNAME
记录是给定(子)域的唯一记录。SOA
这与在顶点上有记录的要求不一致。(有一些努力改变规范以允许CNAME
和SOA
共存,但仍然有许多损坏的 SMTP 实现会被CNAME
域上的混淆。)
您可以通过以下选项让 SSL 在顶点上运行:
- 在重定向服务器上使用支持 SSL 的第三方服务。你可能会为此付出代价。 这是一项服务。 我不推荐这条路线,因为它使您无法控制可靠性,并要求您将 SSL 证书的密钥交给可能值得或可能不值得信赖的人。
- 运行您自己的重定向服务器。由于 apex 需要
A
记录,因此您需要一个静态 IP,而 Heroku 和 AWS 的 ELB 等服务不提供该 IP。因此,如果您处于云环境中,那么保证可靠性将非常困难(如果不是不可能的话)。从好的方面来说,您保留对 SSL 密钥的控制权。
- 使用允许您设置别名的 DNS 主机。将别名指向您的 Heroku 域/ELB/其他。这很可能是最好的选择。
别名在技术上不是一种 DNS 记录。相反,它是 DNS 主机端的一种特殊配置,它A
从另一个查找的结果中返回一条记录。换句话说:
- 您的操作系统向您的 DNS 主机发出对example.com的 DNS 请求。
- 您的 DNS 主机读取内部别名配置,并为该域发出 DNS 请求。因此,如果您为example.herokuapp.com设置了别名,它将查找
A
该域的记录。
- DNS 主机返回一个简单的
A
记录,其中包含从别名查找中获得的 IP。
使用别名记录,您可以将您的顶点指向您的www域所在的同一个云负载均衡器CNAME
。假设您已经在www域上设置了 SSL ,那么裸域就可以正常工作。此时,您可以选择是您的应用发出重定向,还是直接通过裸域提供您的内容。