Aws lambda 云锋Lambda@EdgeHTTPS重定向

Aws lambda 云锋Lambda@EdgeHTTPS重定向,aws-lambda,amazon-cloudfront,Aws Lambda,Amazon Cloudfront,我有一个CloudFront发行版,其中有一个Lambda函数连接到查看器请求挂钩。我用它重定向到规范域(例如www.foo.tld->foo.tld)。我还将发行版本身设置为重定向HTTP->HTTPS 问题是,这要求客户端可能必须执行两个请求才能访问正确的URL。例如: http://www.foo.tld/ -> https://www.foo.tld/ (performed by CloudFront) https://www.foo.tld/ -> https://foo.

我有一个CloudFront发行版,其中有一个Lambda函数连接到查看器请求挂钩。我用它重定向到规范域(例如www.foo.tld->foo.tld)。我还将发行版本身设置为重定向HTTP->HTTPS

问题是,这要求客户端可能必须执行两个请求才能访问正确的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/
看起来我需要将此功能添加到请求事件中,但似乎表明该协议未在请求事件中暴露给Lambda函数

我的问题是:

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

旁注:更改主机名和方案的重定向可能会有问题,将来会比现在更严重,因为浏览器不再接受没有TLS的HTTP行为。目前,我无法引用一个来源来支持这一点,但我的印象是直接从
http://www.example.com
https://example.com
应避免使用。不过,如果那是你想要的


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

如果在缓存行为设置中将
CloudFront-Forwarded-Proto
头列为白名单,则可以如下方式访问该值:

const request=event.Records[0].cf.request;//你可能已经有这个了
const scheme=request.headers['cloudfront-forwarded-proto'][0]。值;
scheme
的值将是
http
https

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

const request=event.Records[0].cf.request;//你可能已经有这个了
const scheme=(request.headers['cloudfront-forwarded-proto']| |[{value:'https'}])[0]。value;
这只能在源请求触发器中完成的原因是,CloudFront实际上不会在内部添加此头,直到查看器请求触发器已经触发(如果有)之后

但请注意,您几乎肯定希望在源请求触发器中执行此操作,因为这些触发器的响应可以缓存。。。这意味着更快的响应和更低的成本。白名单标题还将其添加到缓存键中,这意味着CloudFront将自动为任何给定页面缓存单独的HTTP和HTTPS响应,并且仅为相同的请求重播它们


另请参见

问题:您是否认为出于安全考虑(避免从不安全的连接重定向到其他域),您应该将协议和规范域重定向分开?或者还有其他潜在的问题吗?我最终按照建议将域重定向和HTTPS重定向分开,因为它简化了配置。