CloudFront 使用 Lambda 将请求重定向到尾部斜杠

CloudFront redirect request with Lambda to trailing slash

我有一个静态 SPA 页面,它使用 S3 作为 CloudFront 的来源。如果我访问 www.domain.com/page,我将获得前缀为 bucket-directory/prod/page/ 的 CloudFront 路径,这是预期的。

是否可以在 AWS Lambda 中捕获路径并将尾部斜杠附加到请求中,因此它变为 www.domain.com/page > [Lambda] > www.domain。 com/page/

我一直在寻找并尝试以下资源,但收效甚微: http://blog.rowanudell.com/redirects-in-serverless/

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

您可以通过两种方式做到这一点。

在 CloudFront 模式中,您可以检查 bucket-directory/prod/page 并使用 lambda 重定向到 bucket-directory/prod/page/.

另外你需要确保模式是按照以下顺序, bucket-directory/prod/page <-- 这将进入 lambda 执行重定向 bucket-directory/prod/page/

页面将根据您的命名约定使用正则表达式。

或者您可以编写一个 Lambda 函数,它可以接受 url 并修改 url 以附加一个斜杠(如果它不存在)并将请求转发到源。

http://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html

Lambda Edge 将使它变得更容易并避免重定向。

使用 Lambdda Edge,您也可以从 bucket-directory/prod/page 更改为 bucket-directory/something/someotherpage。

文档 link 应该有所帮助。

在 Cloudfront 上为 SPA 或静态页面进行完美设置并非易事。简而言之,您将需要(至少)为您的 CF 发行版使用原始请求 lambda 函数设置。您需要处理一些边缘情况,例如:

  • 哈希值
  • 重定向到带有尾部斜线的网址(您提到的)
  • 重定向时转发查询参数

快速启动功能可以查看这篇文章https://tinyendian.com/articles/better-origin-response-function-for-cloudfront-hosted-static-pages explaining the actual code that you can copy from here https://gist.github.com/karolmajta/6aad229b415be43f5e0ec519b144c26e

当然,随着您的应用发生变化,您可能需要不时修改此代码段以满足您的需求。