2

我正在使用 CloudFront 向我们在亚马逊之外托管的服务提出请求。该服务受到保护,我们希望调用我们服务的应用程序传递一个“授权”标头。

我们已经尝试从 Cloud Front 调用我们的服务,但看起来头部正在被 Cloud Front 丢弃。因此服务拒绝请求,客户端得到 401 禁止响应。对于一些不需要授权的静态请求,我们没有收到任何错误,并且正在从 CloudFront 获得正确的响应。

我浏览了 CloudFront 文档,没有关于如何处理标头的具体信息,因此希望它们能按原样传递,但看起来情况并非如此。各位大侠有什么指导吗?

4

5 回答 5

1

可以在此处找到 CF 删除或修改的标头列表

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#RequestCustomRemovedHeaders

于 2014-04-14T17:01:01.543 回答
0

默认情况下,CloudFront 确实会删除 Authorization 标头,并且不会将其传递给源。

如果您希望将某些标头发送到源,您可以在 CloudFront-> 行为设置-> 转发标头下设置标头白名单。只需选择您希望转发的标头,CloudFront 就会为您完成这项工作。我已经以这种方式对我们的一项基于位置的服务进行了测试,它就像一个魅力。

我需要验证的一件事是授权标头是否将包含在缓存键中,并且这样做是否安全?这也是您可能需要注意的事情。

于 2014-08-05T17:40:22.150 回答
0

除了在 Origin Behavior 部分下指定它们之外,您还可以将自定义标头添加到您的源配置中。在CloudFront 自定义标头的 AWS 文档中

如果您指定的标头名称和值尚未出现在查看器请求中,CloudFront 会添加它们。如果存在标头,CloudFront 会在将请求转发到源之前覆盖标头值。

这样做的好处是您可以使用 All/wildcard 设置在行为部分中将您的标头列入白名单。

于 2017-12-05T01:32:00.890 回答
-1

CF 删除 Authorization 标头是有道理的,想象一下 2 个用户请求同一个对象,第一个用户将授予访问权限,CF 将缓存该对象,然后第二个用户将获取该对象,因为它先前由 CloudFront 缓存。

好消息是使用转发标头,您可以将授权标头转发到源,这意味着对象将被缓存多次,因为标头值是缓存“键”的一部分

例如用户 A GETS private/index.html 授权:XXXXXXXXXXXXX

  • 该对象将被缓存为 private/index.html + XXXXXXXXXXXXX(这是在 CF 中缓存该对象的关键)

现在,当来自不同用户的新请求到达 CloudFront GET private/index.html Authorization: YYYYYYYYYYYY

  • 由于 private/index.html + YYYYYYYYYYYY 的组合不在 CF 缓存中,该对象将被传递到源。

然后 Cf 将缓存 2 个具有相同名称(但哈希组合名称不同)的不同对象。

于 2014-10-23T07:35:58.533 回答
-1

听起来您正在尝试从 CloudFront 提供动态内容(至少在经过身份验证的用户与未经身份验证的用户的内容不同的意义上),这并不是它的设计初衷。

CloudFront 是一个内容分发网络 (CDN),用于在分布式边缘服务器上缓存内容,以便在您的客户端附近提供数据,而不是每次都访问您的服务器。

如果 CloudFront 定期更改,您可以将其配置为在短时间内缓存页面,并且在某些用例中这是值得的(例如,您想要“微缓存”以减少服务器负载的大容量网站)但它没有听起来这就是您尝试使用它的方式。

在您描述的情况下:

  • 用户将点击 CloudFront 的页面。
  • 它不会在缓存中,因此 CloudFront 将尝试从源服务器中提取副本。
  • 源服务器将回复 401,因此 CloudFront 不会缓存它。

即使这可行并且标头以某种方式来回传递,如果每个页面无论如何都会访问您的服务器,那么使用 CloudFront 也毫无意义;由于到服务器的额外往返行程,您只会使页面变慢。

于 2013-08-08T10:14:57.680 回答