【问题标题】:CloudFront Lambda@Edge HTTPS redirectCloudFront Lambda@Edge HTTPS 重定向
【发布时间】:2023-04-05 23:53:01
【问题描述】:

我有一个 CloudFront 分配,其中包含一个附加到查看器请求挂钩的 Lambda 函数。我正在使用它来重定向到规范域(例如 www.foo.tld -> foo.tld)。我还将分发本身设置为重定向 HTTP -> HTTPS。

问题在于,这要求客户端可能必须执行 2 次请求才能到达正确的 URL。例如:

http://www.foo.tld/ -> https://www.foo.tld/ (performed by CloudFront)
https://www.foo.tld/ -> https://foo.tld/ (performed by Lambda function attached to viewer request hook)

我想在 1 个请求中完成此操作:

http://www.foo.tld/ -> https://foo.tld/

看起来我需要将此功能添加到请求事件中,但documentation 似乎表明该协议未在请求事件中暴露给 Lambda 函数。

我的问题是:

  • 如何将协议公开给附加到查看器请求挂钩的 Lambda 函数?
  • 或者,有没有更好的方法来做到这一点?

【问题讨论】:

    标签: aws-lambda amazon-cloudfront


    【解决方案1】:

    旁注:改变两个主机名方案的重定向可能会出现问题,在未来比现在更多,因为浏览器在没有 TLS 的情况下越来越不接受 HTTP 行为.目前,我不知道引用一个来源来支持这一点,但我的印象是应该避免将直接http://www.example.com 重定向到https://example.com。不过,如果这就是你想要的......


    CloudFront 和 Lambda@Edge 支持这一点,但仅在源请求触发器中。

    如果您在缓存行为设置中将 CloudFront-Forwarded-Proto 标头列入白名单,则可以像这样访问该值:

    const request = event.Records[0].cf.request; // you may already have this
    const scheme = request.headers['cloudfront-forwarded-proto'][0].value;
    

    scheme 的值将是 httphttps

    我有点迂腐,所以我喜欢故障保险。此替代版本将始终将 scheme 设置为 https 并避免由于任何原因标头不存在时将引发的异常。这可能符合您的口味,也可能不符合您的口味:

    const request = event.Records[0].cf.request; // you may already have this
    const scheme = (request.headers['cloudfront-forwarded-proto'] || [{ value: 'https' }])[0].value;
    

    这只能在 Origin Request 触发器中完成的原因是 CloudFront 实际上不会在内部添加此标头,直到 Viewer Request 触发器已经触发(如果有的话)。

    但也请注意,您几乎肯定想要在 Origin Request 触发器中执行此操作——因为来自这些触发器的响应可以被缓存...这应该意味着更快的响应和更低的成本。将标头列入白名单还会将其添加到缓存键中,这意味着 CloudFront 将自动缓存任何给定页面的单独 HTTP 和 HTTPS 响应,并且仅针对相同的请求重放它们。

    另见https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html#lambda-cloudfront-star-headers

    【讨论】:

    • 问题:您是否认为出于安全考虑应该将协议和规范域重定向分开(避免从不安全的连接重定向到不同的域)?还是有其他潜在问题?
    • 我最终按照建议将域重定向和 HTTPS 重定向分开,因为它简化了配置。
    • 我并不总是评论 SO 答案如何为我节省了时间,但当我这样做时,我会这样做。
    猜你喜欢
    • 2020-07-15
    • 2019-07-25
    • 2018-06-17
    • 2019-02-04
    • 2019-04-21
    • 2020-12-08
    • 2022-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多