Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

限制您的内容的地理分配

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

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

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

使用 CloudFront 地理限制功能

当用户请求您的内容时,CloudFront 通常会提供请求的内容,而不考虑用户所在的位置。如果您需要阻止特定国家/地区的用户访问您的内容,可以使用 CloudFront 地理限制功能来执行下列操作之一:

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

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

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

注意

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

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

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

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

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

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

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

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

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

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

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

  1. 登录 AWS 管理控制台,通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/

  2. 选择要更新的分配。

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

  4. 选择 Edit

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

  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. 编写您的应用程序,以做到以下几点:

    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 地址欺骗。