首页 > 解决方案 > 如何在 AWS ALB 上重定向到 https://example.com/ 而不是 https://example.com:443/?

问题描述

我已将以下重定向规则配置到我的 AWS Application Load Balancer,以将所有 HTTP 流量重定向到 HTTPS:

重定向规则

问题是,当我现在curl(或在浏览器中访问域)时,我会得到这个丑陋且冗余Location的响应(域更改为 example.com):

~ $ curl -I http://www.example.com
HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Mon, 14 Sep 2020 18:28:48 GMT
Content-Type: text/html
Content-Length: 150
Connection: keep-alive
Location: https://www.example.com:443/

我知道这https://www.example.com:443/在实践中很好,而且我知道它不会显示在最终用户的浏览器的 URL 字段中。但是,它仍然会显示在浏览器的网络选项卡的“响应标头”中,在我看来,与没有端口的重定向相比,它看起来不专业,例如:

~ $ curl -I http://www.apple.com
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: https://www.apple.com/
Cache-Control: max-age=0
Expires: Mon, 14 Sep 2020 18:33:23 GMT
Date: Mon, 14 Sep 2020 18:33:23 GMT
Connection: keep-alive
strict-transport-security: max-age=31536000
Set-Cookie: geo=FI; path=/; domain=.apple.com
Set-Cookie: ccl=izHQtSPVGso4jrdTGqyAkA==; path=/; domain=.apple.com

从 URL 中删除端口似乎是合乎逻辑的事情,但不幸的是,它是必填字段:

端口字段

此外,“切换到完整 URL”选项似乎并没有真正帮助,即使可以在那里清除端口:

编辑完整网址

保存后它仍然出现:

保存完整网址

有什么办法可以使这项工作?

编辑:
我的域是通过 AWS Route 53 管理的。

标签: amazon-web-serviceshttpsload-balancingamazon-elbhttp-redirect

解决方案


更新:也许值得一提的是,这是一个很好的练习和展示能力。但是,在 Lambda 重定向和纯负载均衡器重定向之间,我仍然建议您使用 ALB-native。它的性能更高(没有冷启动,没有额外的跃点),更不容易出错(不需要编码),只是为了网络跟踪或开发工具的美观。最终用户永远不会注意到这一点(您可能每天都会浏览很多这些网站,而您甚至都不知道)。所以如果你问我,我建议不要用这样的东西去生产。

如果您想要一些非常简单的重定向,您可以创建一个目标组,指向一个返回重定向的 Lambda 函数。它不需要管理 CloudFront 分配或尝试使其在负载均衡器后面工作的开销,因为这也需要更改您的 DNS,因为您不能只将 CloudFront 放在负载均衡器后面(我不知道, 至少)。

对于您的情况,我使用以下代码创建了一个 Lambda 函数(Python 3.8):

def lambda_handler(event, context):
    response = {}
    
    if event.get('headers', {}).get('x-forwarded-proto', '') == 'http':
        print(event)
        response["statusCode"]=302
        response["headers"] = {"Location": f"https://{event['headers']['host']}{event['path']}"}
        response["body"]=""
        
    return response

然后,我使用该 Lambda 函数作为后端创建了一个新的目标组: 创建新的目标组作为 Lambda 函数 选择之前创建的 Lambda

最后,我将端口 80 上的侦听器配置为重定向目标组: 将端口 80 上的侦听器配置到新的目标组

使用此实现,您的 302 重定向将按预期显示: 没有港口的位置


推荐阅读