15

我正在使用具有自定义源的 CloudFront,并希望将某些进入 Web 应用程序的请求重定向到 CloudFront(客户端使用直接 URL,不能将其更改为基于 CloudFront 的 URL)。为了确保正确更新 CloudFront 上的缓存,我不得重定向来自 CloudFront 本身的请求。有没有办法在源服务器上识别此类请求?

CloudFront 是否向发送到源服务器的请求添加任何自定义标头?或者有没有其他可靠的方法来确定请求来自 CloudFront?

4

5 回答 5

13

是的,您可以通过检查用户代理来识别从云端到源服务器的请求。用户代理将是“Amazon CloudFront”

于 2012-12-06T20:06:29.470 回答
13

更新

这是一个老问题,但我的更新对某人研究或寻找新解决方案很有用。

最近 AWS 添加了新功能 Origin Custom Headers。您可以设置一个带有秘密值的标头,并通过 Web 服务器或您的应用程序在您的源服务器上检查它。

在此处输入图像描述

于 2017-03-06T21:01:03.953 回答
11

更新

Avinash Bijja 正确指出(+1)对于来自 Amazon CloudFront 服务器的请求, HTTP用户代理标头将是“Amazon CloudFront” 。不幸的是,这似乎并没有被明确记录,但是在各个论坛中的各种帖子中都隐含地承认了这一点,例如,参见 AWS 团队对用户代理字符串的响应 - CF 会覆盖用户代理字符串吗?

你是对的。User-Agent 字段始终填充为“Amazon CloudFront”。

但是,事实证明这目前并不完全可靠,如果在发起的客户端请求中已经丢失了一个空的用户代理, CloudFront 会向源发送一个空的用户代理:

当原始客户端未发送用户代理时,我可以确认 CloudFront 未向源发送用户代理。我们对积压的用户代理处理进行了增强和修复,但目前没有发布日期。我已经给你发了一个 PM 有更多的细节。

至少截至 2013 年 2 月 7 日,这些增强和修复显然还没有推出。

这些增强和修复已于 2013 年 8 月 5 日推出(感谢webbiedave的更新!)。


初步答案

CloudFront 是否向发送到源服务器的请求添加任何自定义标头?

确实有人会这么认为,但至少它们似乎没有记录在我所期望的地方,即CloudFront 如何处理和转发请求到您的自定义源服务器。鉴于您可以控制原始服务器,您可能只是检查其 HTTP 访问日志吗?

或者有没有其他可靠的方法来确定请求来自 CloudFront?

您需要自己判断可靠性,但CloudFront 转发到源服务器的 IP 地址是 CloudFront 服务器的 IP 地址,而不是最终用户计算机的 IP 地址。- 因此您可以限制对已发布的Amazon CloudFront 公共 IP 范围的访问;但是,请注意各自的免责声明:

CloudFront IP 地址经常更改,我们不能保证提前通知更改。我们将尽最大努力提供当前地址列表。客户不应将这些地址用于关键任务应用程序,并且绝不能在 DNS 名称中对其进行硬编码。[强调我的]

因此,您需要监控此论坛/帖子以尽早注意到相应的更改(当然,如果您的用例首先可以接受此约束)。

于 2012-11-25T11:59:27.837 回答
2

CloudFront 似乎会在将X-Amz-Cf-Id每个请求转发到源之前为其添加一个标头。至少,它目前正在为我这样做。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior

于 2016-05-25T15:41:50.027 回答
1

这可能应该是对 Reza 的回答的评论,但我不能这样做:)。

为了完整起见,这里是有关Forwarding Custom Headers的官方文档的链接,目前声明如下。

您可以将 CloudFront 配置为在将请求转发到您的源时包含自定义标头。您可以为自定义源和 Amazon S3 存储桶指定每个源的自定义标头的名称和值。自定义标头有多种用途,例如:

您可以识别 CloudFront 转发到您的自定义源的请求。如果您想知道用户是否绕过 CloudFront,或者如果您使用多个 CDN 并且想要了解哪些请求来自每个 CDN,这将非常有用。(如果您使用的是 Amazon S3 源并且启用了 Amazon S3 服务器访问日志记录,则日志不包含标头信息。)

于 2017-11-07T17:42:44.553 回答