如何在 Amazon Route53 中将 http 请求转发到 https?

Posted

技术标签:

【中文标题】如何在 Amazon Route53 中将 http 请求转发到 https?【英文标题】:How to forward http request to https in Amazon Route53? 【发布时间】:2012-08-24 00:09:10 【问题描述】:

我在 Amazon Route53 中有一个子域。比如说secure.example.com

如果请求像 https://secure.example.com 一样,那没关系,但我想强制 http 请求通过 https。当用户输入http://secure.example.com时,需要转发到https://secure.example.com

Amazon Route53 中是否存在通过httphttps 的域级别重定向/转发请求?

【问题讨论】:

【参考方案1】:

2019 +

@Jamaurice Holt 解决方案引领我前进,但有点短

经典负载均衡器

此解决方案仅适用于应用负载均衡器,不适用于经典负载均衡器,但您可以迁移以在 EC2 > 负载均衡器 > 您的负载均衡器 > 迁移中使用更新的应用均衡器

应用负载均衡器

在控制台上转到 EC2 > 负载均衡器 > 您的负载均衡器 > 侦听器

这里你应该有两条规则:HTTP : 80 和 HTTPS : 443

你只需要:

编辑 HTTP : 80 规则

移除转发规则并添加重定向规则到端口 443

保存,您应该会看到如下内容:

【讨论】:

您使用的是什么类型的负载均衡器? 这是应用负载均衡器 您真的需要负载均衡器吗?我知道它解决了这个问题,因为负载均衡器必须使用 SSL 证书才能完成他们的工作,但在这种情况下,它仍然感觉有点矫枉过正,特别是如果我只有一个 Ec2 实例。此外,负载均衡器不是成本中立的。 @Lucky 中等/重度使用的应用需要负载均衡器,小型项目可能不需要它 @SebastienHorin 这正是我的观点。如果您的基础架构已经需要实施负载均衡器,那么此解决方案是完美的。但是最初的问题似乎发生在一个不需要负载均衡器开始的场景中,因此实现负载均衡器没有多大意义,只是将http请求转发到https。这仍然是一个很好的解决方案,但并非适用于所有情况。这就是说,只要您拥有多个 ec2 实例,此解决方案就非常有意义,但不适用于较小的数字。【参考方案2】:

只是这个问题的快速更新。在回答您的问题时,您不能使用路由 53 来强制使用 HTTPS,这会导致一些人认为在 AWS 托管上强制使用 https 是不可能的。

您可以在证书管理器中创建 SSL 证书(或导入您自己的),将您的网站托管在任何位置(S3/EC2),然后您需要为您的站点设置 CloudFront 分配并导入您的 SSL 证书,然后您可以通过 CloudFront 控制台中的行为选项卡使用选项 Redirect HTTP to HTTPS

【讨论】:

我试过这个,但是我一直在 http 请求中被拒绝访问(403)。我必须这样做只是因为我有一个单页应用程序,我可以在分发的错误页面选项卡中创建自定义错误响应,以将 403 重定向到 /index.html 并具有 200 OK 状态。 您好,这听起来像是您的 S3 存储桶的权限问题,您在设置它并授予对所有对象的公共访问权限时是否选择了虚拟主机? 这是正确答案,应该这样标记。高分! 作为 LB 的替代方案,cloudfront 在一个实例的情况下会产生更多收益。我在现场实例上有一个 elasticbeanstalk env,有一个 DNS,然后为此 DNS 创建了一个云端分发。这使我的应用程序(一个 web2py 应用程序)能够通过 https 进行连接。我看到网址得到 https。但是应用程序在寻找安全连接时遇到了错误,这意味着接收到的连接仍然是 http。这对我来说仍然没有意义。 @ShrutiKar 在您可以重定向 http->https 的行为中,您的 EC2 实例也需要安装证书。【参考方案3】:

我使用 (ELB) 应用程序负载平衡器完成了它,并将流量重定向到 ELB 编辑部分中的端口 443。当然,我使用 ec2 实例来托管我的应用程序和网站。

【讨论】:

@Jamaurice Holt 解决方案引导我前进,但有点短,所以我发布了一个更完整的【参考方案4】:

不,没有办法做到这一点——因为它不是强制任何特定协议或将值从一个协议推送到另一个协议的 DNS 功能。在 Apache、IIS 或 nginx 中,您可以在 Web 服务器级别轻松完成此操作。

在任何一种情况下,将特定记录指向特定地址(无论是 IP 还是其他主机名)的 A 或 CNAME 值都是相同的,它只是通过端口 80 或端口 443 进行连接。

在 Apache 中,您可以简单地使用重写(首先启用 mod_rewrite):

RewriteEngine On
RewriteCond %SERVER_PORT !^443$
RewriteRule (.*) https://www.host.com/$1 [R]

【讨论】:

有什么方法可以将 HTTPS 重定向到 AWS EC2 上的 HTTP? @user9437856 EC2 只是原始计算基础设施,因此将 HTTP 重定向到 HTTPS(反之亦然)的方法是使用 Web 服务器(apache2、nginx 等)或 HTTP 负载均衡器像HAproxy。如果您在 EC2 实例前使用 ELB,则可以将其设置为重定向。

以上是关于如何在 Amazon Route53 中将 http 请求转发到 https?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Amazon Route 53 与 Digital Ocean 水滴一起使用?

如何使用 Amazon Route 53 将子域重定向到特定页面?

Amazon Route 53 DNSSEC 支持

Amazon Route 53 设置和 301 重定向设置

从 Amazon Route 53 导出 DNS 区域文件

Amazon Route 53 DNS 反向查找区域 - ATT IP 块设置