限制您的内容的地理分配 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

限制您的内容的地理分配

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

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

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

使用 CloudFront 地理限制功能

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

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

  • 当用户位于阻止列表中被禁止的国家/地区之一时,阻止他们访问您的内容。

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

注意

CloudFront 使用第三方数据库确定用户的位置。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. 登录 Amazon Web Services Management Console,并通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/v3/home

  2. 选择要更新的分配。

  3. 选择地理限制

  4. 选择 Edit(编辑)。

  5. 选择允许列表以创建允许的国家/地区的列表,或选择阻止列表以创建被阻止的国家/地区的列表。

  6. 将所需的国家/地区添加到列表中,然后选择保存更改

使用第三方地理定位服务

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

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

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

使用第三方地理定位服务限制对 CloudFront 分配中的文件的访问

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

  2. 将您的内容上传到 Amazon S3 存储桶。

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

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

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

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

    • 如果要将内容分发到用户的位置,请为您的 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 地址是最有可能与用户的地理位置关联的 IP 地址。

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