AWS Route53 和 Lambda:将裸 HTTP 请求重定向到无服务器应用程序的 HTTPS WWW

AWS Route53 和 Lambda:将裸 HTTP 请求重定向到无服务器应用程序的 HTTPS WWW

问题

我有一个在“无服务器”AWS Lambda 函数上运行的站点。Route53 将请求路由到连接到 Lambda 函数的 API 网关。

问题在于您无法设置传统的服务器重定向。

例子

举个例子,我遵循了这个问题/答案要路由http://<my_domain>.comhttps://www.<my_domain>.com,我使用 S3 存储桶的 A 记录别名,该存储桶设置为静态站点重定向到https://www.<my_domain>.com

问题

如何在 Lambda 这样的无服务器环境中https://<my_domain>.com进行重定向?https://www.<my_domain>.com

答案1

您必须在 lambda 函数中执行重定向。

我确信 URL 中使用的实际主机名已传递给 Lambda,可能是event.headers.Host。因此,在您的 Lambda 中,您必须执行类似以下 Python 代码的操作:

def lambda_handler(event, context):
    if not event['headers']['Host'].startswith('www'):
        return PermanentRedirect('www.'+event['headers']['Host']+event['path'])

但是,如果我是你,我会将非 www 主机名指向另一个 API 网关,并使用一个专门用于执行到 www 的重定向的 Lambda。然后在你的实际工人lambdas 您不必担心重定向。

希望有帮助:)

答案2

我认为 cloudfront 上有一个设置可以做到这一点。要么那样,要么使用 lambda@edge — 这样您就不会创建“真正的”lambda。

我个人使用的另一种选择是将 Cloudflare 放在您的 cloudfront 分发前面 — — 当然是两个 CDN,但 Cloudflare 可以非常轻松地完成这些重定向。

另一种选择是创建两个 cloudfront 发行版,一个用于 www,一个用于非 www,但两者都位于同一个 API 网关。这不是理想的选择,因为缓存的好处会受到限制,但它会起作用。

相关内容