HTTPS 从根域(即 apex 或“naked”)重定向到“www”子域,而浏览器不会抛出异常?

2024-01-07

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

...哪个Heroku 建议避免 https://devcenter.heroku.com/articles/apex-domains。 Heroku 建议两种解决方法:

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

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

是否可以将 HTTPS 请求从根(即 apex 或“naked”)域重定向到“www”子域,而不会导致浏览器崩溃?

Heroku 认为不是:

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

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

澄清更新:

从 apex 重定向到“www”的真正问题是键入https://example.com直接进入浏览器将引发证书警告。当然,这是一种边缘情况,但不是小问题。

解决方案更新:

我解决了这个问题DNSimple https://dnsimple.com。 (甚至不必转移我的域名!)

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


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

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

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

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

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

只有此时,HTTP 重定向才会发生。浏览器发送请求(GET /,服务器可以用 301 响应任何其他 URL。

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

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

那么你为什么不能CNAME顶点?这是被禁止的。 http://www.ietf.org/rfc/rfc1034.txt

域系统使用规范名称提供了这样的功能 (CNAME) RR [记录资源]。 ACNAMERR 将其所有者名称标识为别名,并且 指定相应的规范名称RDATA的部分 RR。If a CNAMERR 存在于节点上,不应有其他数据 展示;这确保了规范名称及其别名的数据 不可能不同。该规则还确保缓存CNAME可 使用时无需与其他 RR 类型的权威服务器进行检查。

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

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

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

An alias从技术上讲,它不是一种 DNS 记录。相反,它是 DNS 主机端的一个特殊配置,返回一个A记录来自另一次查找的结果。换句话说:

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

使用别名记录,您可以将您的顶点指向与您的顶点相同的云负载均衡器。www域是CNAMEd 至。假设您已在www域,裸域就可以正常工作。此时,您可以选择您的应用程序是否发出重定向,或者直接通过裸域提供您的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTPS 从根域(即 apex 或“naked”)重定向到“www”子域,而浏览器不会抛出异常? 的相关文章

随机推荐

  • R中的分组计算[重复]

    这个问题在这里已经有答案了 我在 R 中对数据框进行了分组和总结 现在我有一个如下表 Group Value Count A 1 4 A 2 2 A 10 4 B 3 2 B 4 4 B 2 3 C 5 3 C 2 6 我有兴趣找出每组中值
  • Powershell 选择 HTML 文本

    我有以下 powershell 脚本来打开多台计算机上的多个 HTML 文件以提取许可信息 寻找一些帮助提取内部文本元素 td where id 2 寻找提取 产品 序列号 产品密钥 请求代码 ForEach system in Get C
  • 创建一个事件接收器来记录列表中用户所做的更改

    我正在开发一个 SharePoint 发布网站 我想在 SharePoint 列表中 记录 用户所做的所有更改 网上的一些搜索引导我找到了 EventReceiver 但我的 EventReceiver 必须是通用的并附加到网站集中的所有列
  • 模块构建失败:错误:TypeScript 编译中缺少 index.ts

    项目描述 我的项目是通过package json下载到node module 包 json dependencies myllc application core git ssh email protected cdn cgi l emai
  • 通过文本别名引用 Javascript 变量

    是否可以通过文本别名引用 JavaScript 变量 例如 var x 2 var y convertToVariableRef x 调用上述函数后 y将是相同的参考x而不仅仅是简单地复制值x into y 如果你声明一个没有任何函数作用域
  • Hakyll 网站的根源是什么?

    我看到创建函数需要一个标识符列表 ghci gt t create create Identifier gt Rules gt Rules 我应该使用什么标识符列表来匹配网站的根目录 例如 我只想制作一个出现在 www example co
  • GPS信号强度计算

    我想使用 NET CF 显示 GPS 设备的信号栏 我能够读取 NMEA 数据并获取 SNR 信号 但它们是许多卫星 有些处于活动状态 有些处于不活动状态 信噪比各不相同 我考虑过获取总 SNR 的平均值 但它不会给出准确的值 因为三颗强信
  • 编辑摊牌:在句子末尾保留换行符

    编辑非所见即所得 LaTeX HTML 等 散文时 您可能希望在句子末尾添加换行符 这有几个优点 更容易重新排列句子 更容易注释句子 更容易发现连续 过长的句子 评论更方便on句子 例如 The following isn t strict
  • 是否可以在 Selenium 中捕获 POST 数据?

    我正在与Selenium http seleniumhq comWebDriver 工具 我想知道该工具是否提供了一种捕获提交表单时生成的 POST 数据的方法 我正在使用 django 测试框架来测试我的数据是否在后端正确处理 我想使用
  • 这是什么 ANT 版本?

    我是 java Eclipse 的新手 我安装了 eclipse 并使用它作为 IDE 来处理 JAVA 1 4 文件 我更改了代码并保存了它并想要运行 cntr F11 或调试 F11 每次我得到 select what to run A
  • WTForms:FormField 的 FieldList 无法加载嵌套数据

    我在 FieldList 内的 FormField 内有一个自定义字段 地点 class LocationForm Form id HiddenField id title StringField l Title Required loca
  • 加载特定 MIME 类型的本机客户端 Chrome 扩展

    我为 Google Chrome Web 浏览器创建了一个本机客户端应用程序 用于播放特殊类型的音频文件 伟大的 此时该部分效果很好 我已准备好进入下一阶段 与世界分享这个应用程序 我需要这部分的帮助 根据我的理解 分发此应用程序的最佳方法
  • 如何预加载 angular2 视图,以便在首次加载时不会闪烁白页?

    我正在用纯 JS 构建一个 Angular 2 应用程序 我的问题是 当我从一个页面更改到另一个页面时 它会闪烁白色页面 直到呈现新视图 仅当我第一次访问所有组件时 才会发生这种情况 如果我第二次转到相同的路线 则页面加载时不会出现白页 我
  • 如何调整分面 tmap 图中的分面行标签高度?

    我正在使用带有行和列的 tmap 包绘制多面地图 我无法调整行的分面标签的高度 这会导致分面标签在大于特定大小或旋转时被裁剪 我已经尝试调整所有tm layout 小组的论据包括panel label height panel label
  • Ansible 循环相关问题

    我有一个剧本 其中有多个角色和串行设置 因此它首先在一台机器上运行 然后在其余机器上运行 在其中一个角色中 我有以下任务 name getting dbnodes IP addresses local action shell echo f
  • WPF 组合框样式

    下面是我的 ComboBox 样式代码 想法是在 ComboBox 周围放置边框并重用该样式
  • 我无法运行 hello.py 并获取 SyntaxError: invalid syntax

    我对 Python 和整个编程都很陌生 很抱歉问了一个看似重复的问题 但是 我无法使用以下格式运行我自己的代码 C Users Archangel gt python hello py 这是 hello py 包含的内容 Define a
  • 递归或循环[重复]

    这个问题在这里已经有答案了 我有这个方法可以计算一些统计数据 public void calculateAverage int hour if hour 20 int data 0 int times 0 for CallQueue cq
  • “+”(加号)CSS 选择器是什么意思?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 p p Some declarations 我不知道是什么 方法 这和仅仅定义样式
  • HTTPS 从根域(即 apex 或“naked”)重定向到“www”子域,而浏览器不会抛出异常?

    DNS A 记录要求将 IP 地址硬编码到应用程序的 DNS 配置中 哪个Heroku 建议避免 https devcenter heroku com articles apex domains Heroku 建议两种解决方法 使用在顶端支