问题
我有一个在“无服务器”AWS Lambda 函数上运行的站点。Route53 将请求路由到连接到 Lambda 函数的 API 网关。
问题在于您无法设置传统的服务器重定向。
例子
举个例子,我遵循了这个问题/答案要路由http://<my_domain>.com
到https://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 网关。这不是理想的选择,因为缓存的好处会受到限制,但它会起作用。