使用 Route 53 + ALB 对域名根记录实现域名转发

一、背景

1、Route 53不支持根域名配置CNAME

在使用Route53提供DNS服务时候,在为根域名提供解析的场景下,有一些局限,例如根域名是不能设置cname的。为了进一步理解,我们举例如下:

如果根域名是abc.com并创建Route53 Public Zone,那么:

  • 可以创建名为www.abc.com的CNAME记录,将其解析为ALB地址或者CloudFront CDN地址
  • 可以创建abc.com的A记录,指向IP
  • 不可以创建根域名abc.com的CNAME记录,界面会提示不支持根域名设置CNAME

最后一个限制,不能创建根域名的cname记录,意味着无法将直接在Route 53将abc.com跳转到www.abc.com

2、域名转发的一些Workaround

为了解决这个限制,可以通过设置S3 Static Webhosting静态托管网站,然后在网站上用页面代码做跳转。但是由此需要配置额外的S3做托管,增加额外配置工作量。

3、使用Route 53 Alias别名功能进行跳转

Route 53支持为根域名设置Alias别名,直接跳转到AWS云上资源。详情可参考如下知识库:

https://aws.amazon.com/premiumsupport/knowledge-center/route-53-create-alias-records/

本文以ALB为例,配置过程如下。

二、创建Route 53 CNAME记录

进入Route 53服务界面,找到要配置的根域名,点击创建记录。

在创建解析记录的界面,在子域名位置留空,就表示要配置的记录是对根域名有效。将类型选择为A记录,然后打开Route traffic to alias的开关。在下拉框中选择Alias to Application and Classic Load Balancer,然后选择Region,再选择要转发的ALB。最后点击创建。如下截图。

创建完成后的记录如下截图所示。

三、在ALB上配置转发规则

接下来进入负载均衡界面,找到上一步转发目标的负载均衡器。进入监听器标签页,找到80端口和443端口的监听器,接下来要分别修改两个端口的转发规则。如下截图。

进入规则编辑界面,点击➕按钮,添加新的一条转发规则。

本例中希望将abc.com跳转到www.abc.com,则进行如下配置:

在配置左侧新的转发规则的位置也就是IF位置,选择规则类型是Host header,输入值是根域名例如abc.com。右侧的THEN下边部分,选择类型是Redirect to...,协议选择https,端口输入443,在下拉框中选择Custom host, path, query,然后在Host位置输入要跳转的域名。例如跳转到www.abc.com,然后点击右上角保存。

配置完成过后,效果如下。

以上是对HTTP协议的监听的支持。接下来对443端口监听器进行同样的设置。

配置ALB完成。

四、测试跳转

为了测试效果,可使用curl请求url头,查看返回结果。执行如下命令:

 curl http://bitipcman.com/ -I

返回结果是:

HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Wed, 29 Jun 2022 09:27:44 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
Location: https://blog.bitipcman.com:443/

由此表示跳转生效。

现在通过浏览器访问根域名abc.com,可以看到自动跳转到https://www.abc.com/

五、参考文档

How do I create alias records for services hosted in AWS:

https://aws.amazon.com/premiumsupport/knowledge-center/route-53-create-alias-records/