限制您的内容的地理分配 - Amazon CloudFront

限制您的内容的地理分配

您可以使用地理限制(也称为地理阻止)来禁止特定地理位置的用户访问您通过 CloudFront 分配分发的内容。要使用地理限制功能,您有两个选项:

  • 使用 CloudFront 地理限制功能。使用该选项可限制对与某个分配关联的所有文件的访问,并在国家/地区级别限制访问。

  • 使用第三方地理定位服务。使用该选项可限制对与某个分配关联的一小部分文件的访问,或在比国家/地区级别更细化级别上限制访问。

使用 CloudFront 地理限制功能

用户请求您的内容时,无论其处于何处,CloudFront 通常都会提供所请求的内容。如果您要阻止特定国家/地区的用户访问您的内容,可以使用 CloudFront 地理限制功能执行以下任一操作:

  • 仅当用户位于批准的国家/地区白名单中的某个国家/地区时,才允许他们访问您的内容。

  • 当用户位于阻止的国家/地区黑名单中的某个国家/地区时,阻止他们访问您的内容。

例如,如果一个请求来自因版权问题导致您无权分配内容的国家/地区,您可以使用 CloudFront 地理限制功能来阻止该请求。

注意

CloudFront 使用第三方 GeoIP 数据库确定您的用户的位置。IP 地址和国家/地区之间映射的准确性因区域而异。根据最近的测试,整体准确性为 99.8%。如果 CloudFront 无法确定用户的位置,则会提供用户请求的内容。

以下是地理限制的工作机制:

  1. 假设您仅有权在列支敦士登分发内容。您更新您的 CloudFront 分配并添加仅包含列支敦士登的白名单。(您也可以添加包含除列支敦士登以外的所有国家/地区的黑名单。)

  2. 摩纳哥的一名用户请求您的内容,DNS 将该请求路由至意大利米兰中的 CloudFront 边缘站点。

  3. 米兰的边缘站点查找您的分配并确定摩纳哥的这名用户不能下载您的内容。

  4. CloudFront 向该用户返回 HTTP 状态代码 403 (Forbidden)

您可以选择性地将 CloudFront 配置为向该用户返回自定义错误消息,并且可以指定您希望 CloudFront 缓存请求的文件的错误响应的时间。默认值为 10 秒。有关更多信息,请参阅 为特定 HTTP 状态代码创建自定义错误页面

地理限制适用于整个分配。如果您需要对部分内容应用一个限制,而对另一部分内容应用不同限制(或无限制),则必须创建单独的 CloudFront 分配或使用第三方地理定位服务。

如果您启用 CloudFront 访问日志记录,则可通过在日志条目中搜索其 sc-status(HTTP 状态代码)值为 403 的条目来标识 CloudFront 已拒绝的请求。不过,如果仅使用访问日志,则无法区分 CloudFront 根据用户位置拒绝的请求与 CloudFront 由于其他原因而使用户无权访问文件因而拒绝的请求。如果您有第三方地理定位服务 (例如 Digital Element 或 MaxMind),则可基于访问日志中的 c-ip (客户端 IP) 列的 IP 地址来识别请求的位置。有关 CloudFront 访问日志的更多信息,请参阅配置和使用标准日志(访问日志)

以下过程介绍如何使用 CloudFront 控制台将地理限制添加到现有的分配。有关如何使用控制台创建分配的信息,请参阅创建分配

将地理限制添加到您的 CloudFront Web 分配(控制台)

  1. 登录 AWS Management Console,并通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/v3/home

  2. 选择要更新的分配。

  3. 分配设置窗格中,选择限制选项卡。

  4. 选择 Edit

  5. 输入适用的值。有关更多信息,请参阅 Restrictions

  6. 选择是,编辑

使用第三方地理定位服务

利用 CloudFront 地理限制功能,您可以在国家/地区级别控制通过给定 Web 分配来分配的所有文件的内容分配。如果可以分发内容的位置存在地理限制,并且这些限制不是按国家/地区界限划分的,或者您希望仅限制访问通过 CloudFront 分配的某些文件,则可以将 CloudFront 与第三方地理定位服务一起使用。这可让您不仅基于国家/地区,还可以基于城市或邮政编码甚至纬度和经度来控制对内容的访问。

如果您使用的是第三方地理定位服务,建议您使用 CloudFront 签名的 URL,这可让您指定过期日期和时间,在该日期和时间后,URL 不再有效。此外,建议您使用 Amazon S3 存储桶作为您的源,因为您随后可以使用 CloudFront 源访问身份来阻止用户直接从源访问您的内容。有关签名的 URL 和源访问身份的更多信息,请参阅使用签名 URL 和签名 Cookie 提供私有内容

以下步骤说明如何使用第三方地理定位服务来控制对您的文件的访问。

使用地理位置限制对 CloudFront 分配中的文件的访问

  1. 获得具有地理定位服务的账户。

  2. 将您的内容上传到 Amazon Simple Storage Service (S3) 存储桶。有关更多信息,请参阅 Amazon S3 文档

  3. 配置 Amazon CloudFront 和 Amazon S3 以提供私有内容。有关更多信息,请参阅 使用签名 URL 和签名 Cookie 提供私有内容

  4. 编写您的 Web 应用程序,以做到以下几点:

    1. 将每个用户请求的 IP 地址发送到地理定位服务。

    2. 评估地理定位服务的返回值,以确定用户是否位于您希望 CloudFront 分发内容的位置。

    3. 如果要将内容分发到用户的位置,请为您的 CloudFront 内容生成签名 URL。如果您不想将内容分发到该位置,请将 HTTP 状态代码 403 (Forbidden) 返回给用户。或者,您可配置 CloudFront 以返回自定义错误消息。有关更多信息,请参阅 为特定 HTTP 状态代码创建自定义错误页面

    有关更多信息,请参阅您使用的地理定位服务的文档。

您可以使用 Web 服务器变量来获取正在访问您网站的用户的 IP 地址。请注意以下几点:

  • 如果您的 Web 服务器未通过负载均衡器连接到 Internet,您可以使用 Web 服务器变量来获取远程 IP 地址。但是,该 IP 地址并不总是用户的 IP 地址。它还可以是代理服务器的 IP 地址,具体取决于用户如何连接到 Internet。

  • 如果您的 Web 服务器通过负载均衡器连接到 Internet,Web 服务器变量可能包含负载均衡器的 IP 地址,而不是用户的 IP 地址。在该配置中,我们建议您使用 X-Forwarded-For HTTP 标头中的最后一个 IP 地址。该标头通常包含多个 IP 地址,其中大部分是代理或负载均衡器的 IP 地址。列表中最后一个 IP 地址是最有可能与用户地理位置有关的。

如果您的 Web 服务器未连接至负载均衡器,建议您使用 Web 服务器变量,而不是 X-Forwarded-For 标头,以避免 IP 地址欺骗。