【问题标题】:How to get the original URL called in AWS Lambda?如何获取 AWS Lambda 中调用的原始 URL?
【发布时间】:2019-03-06 01:44:07
【问题描述】:

我在 API Gateway 中设置了代理集成。

我可以使用https://7kbw9fcfa4.execute-api.us-east-1.amazonaws.com/dev/foo 之类的 URL 调用我的 lambda,这里的路径是 /dev/foo

但是,如果我在前面设置 CloudFront,则 URL 变为 https://a45ex7tnds5r5o.cloudfront.net/foo,路径为 /foo

在这两种情况下,我在 event 变量中都有相同的键:

  • path 包含 /foo
  • requestContext.path 包含 /dev/foo

如何可靠地获取客户端在浏览器中看到的实际 URL? (使用 Cloudfront 和直接使用 API Gateway 时)

【问题讨论】:

  • 您是否尝试过查看原始标头?此外,您是否启用了从 CloudFront 到 API Gateway 的标头。如果您不将标头列入白名单,您将无法从 CloudFront 获取它们。
  • @Kannaiyan 我将除Host 标头之外的所有标头都列入了白名单,因为建议不要转发它(否则它会破坏 Cloudfront -> API Gateway 连接)。 Origin 标头似乎没有用,因为它只包含域名,而不是路径(请参阅developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin)。

标签: amazon-web-services aws-lambda aws-api-gateway amazon-cloudfront


【解决方案1】:

您可以将 configure your CloudFront distribution to use a custom header 传递给 Lambda 函数。然后,您可以根据是否存在仅限 CloudFront 的标头来确定是使用 path 还是 requestContext.path

【讨论】:

  • 这对我来说不好(请参阅问题中的详细信息),因为当我使用 CloudFront 时,浏览器中的 URL 是 /foo,而不是 /dev/foo。然而(这就是问题所在)event 中的变量是相同的,无论是否使用 CloudFront。所以没有办法知道它是否通过 CloudFront。
  • 很抱歉造成误解;我明白你现在的意思了。我已经更新了答案以更好地解决这个问题。
  • 谢谢,你明白了!这是一个有趣的答案,它会起作用!理想情况下,我想找到一个“更自动化”的解决方案,因为它是针对开源项目的,所以我宁愿避免每次都要求用户创建特定的 CloudFront 标头(请参阅github.com/mnapoli/bref/issues/67)。如果您有任何见解,那就太棒了!无论如何感谢您的想法!
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2017-12-23
  • 2020-04-22
  • 1970-01-01
相关资源
最近更新 更多