amazon-web-services - 如何在 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 管理的。
解决方案
更新:也许值得一提的是,这是一个很好的练习和展示能力。但是,在 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
推荐阅读
- python - 将掩码应用于数据框后从列中删除字符串
- scikit-learn - 验证 RandomizedSearchCV 结果的问题
- php - 在 Laravel 中解析具有 N 级的 FedEx 多维数组时出错
- c# - Select Tag Helper in ASP.NET Core MVC post 后需要返回查看时为空
- java - 无法在超级账本结构中调用链码
- regex - 使用 Scala Iterator 使用 RegEx 匹配将大流(从字符串)分解成块,然后对这些块进行操作?
- flutter - 使用 NestedScrollView,向上滚动会将其他选项卡重置为上方
- vue.js - 在另一个 GET 请求中访问响应
- css - Atom 编辑器中的平滑插入符号动画
- javascript - document.querySelector('.header--input').value vs e.target.value