

# 限制您的内容的地理分配
<a name="georestrictions"></a>

您可以使用*地理限制*（有时称为*地理阻止*）来禁止特定地理位置的用户访问您通过 Amazon CloudFront 分配分发的内容。要使用地理限制功能，您有两个选项：
+ 使用 CloudFront 地理限制功能。使用该选项可限制对与某个分配关联的所有文件的访问，并在国家/地区级别限制访问。
+ 使用第三方地理定位服务。使用该选项可限制对与某个分配关联的一小部分文件的访问，或在比国家/地区级别更细化级别上限制访问。

**Topics**
+ [使用 CloudFront 地理限制](#georestrictions-cloudfront)
+ [使用第三方地理定位服务](#georestrictions-geolocation-service)

## 使用 CloudFront 地理限制
<a name="georestrictions-cloudfront"></a>

用户请求您的内容时，无论其处于何处，CloudFront 通常都会提供所请求的内容。如果您要阻止特定国家/地区的用户访问您的内容，可以使用 CloudFront 地理限制功能执行以下任一操作：
+ 仅当用户位于允许列表中的某个已批准国家/地区时，才授予他们访问您的内容的权限。
+ 当用户位于拒绝列表中被禁止的国家/地区之一时，阻止他们访问您的内容。

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

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

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

1. 假设您仅有权在列支敦士登分发内容。您可以更新您的 CloudFront 分配以添加仅包含列支敦士登的允许列表。（您也可以添加包含除列支敦士登以外所有国家/地区的拒绝列表。)

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

1. 米兰的边缘站点将检查您的分配，并确定摩纳哥的这名用户没有权限，无法下载您的内容。

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

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

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

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

以下过程介绍如何使用 CloudFront 控制台将地理限制添加到现有的分配。有关如何使用控制台创建分配的信息，请参阅[创建分配](distribution-web-creating-console.md)。<a name="restrictions-geo-procedure"></a>

**将地理限制添加到您的 CloudFront Web 分配（控制台）**

1. 登录 AWS 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 在导航窗格中，选择**分配**，然后选择要更新的分配。

1. 选择**安全**选项卡，然后选择**地理限制**。

1. 选择**编辑**。

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

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

## 使用第三方地理定位服务
<a name="georestrictions-geolocation-service"></a>

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

如果您使用的是第三方地理定位服务，建议您使用 CloudFront 签名的 URL，通过它可以指定过期日期和时间，在该日期和时间后，URL 不再有效。此外，建议您使用 Amazon S3 存储桶作为您的源，因为您随后可以使用 CloudFront [源访问控制](private-content-restricting-access-to-s3.md)来阻止用户直接从源访问您的内容。有关签名的 URL 和源访问控制的更多信息，请参阅[使用签名 URL 和签名 Cookie 提供私有内容](PrivateContent.md)。

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

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

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

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

1. 配置 Amazon CloudFront 和 Amazon S3 以提供私有内容。有关更多信息，请参阅 [使用签名 URL 和签名 Cookie 提供私有内容](PrivateContent.md)。

1. 编写您的 Web 应用程序，以做到以下几点：
   + 将每个用户请求的 IP 地址发送到地理定位服务。
   + 评估地理定位服务的返回值，以确定用户是否位于您希望 CloudFront 分配您的内容的位置。
   + 如果要将内容分发到用户的位置，请为您的 CloudFront 内容生成签名的 URL。如果您不想将内容分发到该位置，请将 HTTP 状态代码 `403 (Forbidden)` 返回给用户。或者，您可配置 CloudFront 以返回自定义错误消息。有关更多信息，请参阅 [为特定 HTTP 状态代码创建自定义错误页面](creating-custom-error-pages.md)。

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

您可以使用 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 地址欺骗。