

# 使用 Amazon S3 托管静态网站
<a name="WebsiteHosting"></a>

您可以使用 Amazon S3 托管静态网站。在*静态*网站上，单独的网页包含静态内容。它们也可能包含客户端脚本。

**注意**  
我们建议您使用 [Amazon Amplify Hosting](https://docs.amazonaws.cn//amplify/latest/userguide/welcome.html.html) 来托管存储在 S3 上的静态网站内容。Amplify Hosting 是一项完全托管式服务，可让您轻松地在由 Amazon CloudFront 提供支持的全球可用内容分发网络（CDN）上部署您的网站，并可实现安全的静态网站托管。  
借助 Amazon Amplify Hosting，您可以选择对象在通用存储桶中的位置，将内容部署到托管式 CDN，并为网站生成一个公有 HTTPS URL 以供在任何地方访问。有关 Amplify Hosting 的更多信息，请参阅[从 S3 通用存储桶将静态网站部署到 Amazon Amplify Hosting](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-amplify.html) 和《Amazon Amplify Console User Guide》**中的 [Deploying a static website from S3 using the Amplify console](https://docs.amazonaws.cn//amplify/latest/userguide/deploy--from-amplify-console.html)。

有关在 Amazon S3 上托管静态网站的更多信息（包括说明和分步演练），请参阅以下主题。

**重要**  
如果您用于托管静态网站的存储桶已使用具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS）进行加密，则必须创建一个 Amazon CloudFront 分配来为您的网站提供服务，因为 SSE-KMS 不支持匿名用户。创建 CloudFront 分配时，必须使用来源访问控制（OAC）而不是来源访问身份（OAI）来保护来源。OAI 不支持 SSE-KMS，因此您必须改用 OAC。  
有关 OAC 的更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[限制对 Amazon S3 源的访问](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)。有关演示如何使用 Amazon CloudFront 托管静态网站的教程，请参阅[教程：使用 Amazon S3、Amazon CloudFront 和 Amazon Route 53 托管点播流视频](tutorial-s3-cloudfront-route53-video-streaming.md)。

**Topics**
+ [网站端点](WebsiteEndpoints.md)
+ [启用网站托管](EnableWebsiteHosting.md)
+ [配置索引文档](IndexDocumentSupport.md)
+ [配置自定义错误文档](CustomErrorDocSupport.md)
+ [设置访问网站的权限](WebsiteAccessPermissionsReqd.md)
+ [（可选）记录 Web 流量](LoggingWebsiteTraffic.md)
+ [（可选）配置网页重定向](how-to-page-redirect.md)
+ [使用跨源资源共享 (CORS)](cors.md)
+ [静态网站教程](static-website-tutorials.md)

# 网站端点
<a name="WebsiteEndpoints"></a>

当您将存储桶配置为静态网站时，该网站在存储桶的 Amazon Web Services 区域 特定的网站端点上可用。网站端点不同于您在其上发送 REST API 请求的端点。有关端点之间的差异的更多信息，请参阅 [网站端点和 REST API 端点之间的主要区别](#WebsiteRestEndpointDiff)。

根据您所在的区域，Amazon S3 网站端点采用以下两种格式之一。
+ **s3-website 短横线 (-) 区域** ‐ `http://bucket-name.s3-website-Region.amazonaws.com`
+ **s3-网站 点 (.) 区域** ‐ `http://bucket-name.s3-website.Region.amazonaws.com`

此 URL 将返回您为该网站配置的默认索引文档。有关 Amazon S3 网站端点的完整列表，请参阅 [Amazon S3 网站端点](https://docs.amazonaws.cn/general/latest/gr/s3.html#s3_website_region_endpoints)。

**注意**  
为了增强 Amazon S3 静态网站的安全性，Amazon S3 网站端点域（例如 *s3-website-us-east-1.amazonaws.com* 或 *s3-website.ap-south-1.amazonaws.com*）已在 [Public Suffix List (PSL)](https://publicsuffix.org/)中注册。为进一步增强安全性，如果您需要在 Amazon S3 静态网站的域名中设置敏感 Cookie，我们建议您使用带 `__Host-` 前缀的 Cookie。这将有助于保护您的域，防范跨站点请求伪造 (CSRF) 攻击。要了解更多信息，请参阅 Mozilla 开发者网络中的 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 页面。

如果您希望您的网站公开，您必须使您的所有内容对您的客户公开可读，以便您的客户可以在网站端点访问这些内容。有关更多信息，请参阅 [设置访问网站的权限](WebsiteAccessPermissionsReqd.md)。

**重要**  
Amazon S3 网站端点不支持 HTTPS 或接入点。如果要使用 HTTPS，可以执行以下操作之一：  
（建议）使用 [Amazon Amplify Hosting](https://docs.amazonaws.cn//amplify/latest/userguide/welcome.html.html) 来托管存储在 S3 上的静态网站内容。Amplify Hosting 是一项完全托管式服务，可让您轻松地在由 Amazon CloudFront 提供支持的全球可用内容分发网络（CDN）上部署您的网站，并可实现安全的静态网站托管。  
借助 Amazon Amplify Hosting，您可以选择对象在通用存储桶中的位置，将内容部署到托管式 CDN，并为网站生成一个公有 HTTPS URL 以供在任何地方访问。有关 Amplify Hosting 的更多信息，请参阅[从 S3 通用存储桶将静态网站部署到 Amazon Amplify Hosting](https://docs.amazonaws.cn//AmazonS3/latest/userguide/website-hosting-amplify) 和《Amazon Amplify Console User Guide》**中的 [Deploying a static website from S3 using the Amplify console](https://docs.amazonaws.cn//amplify/latest/userguide/deploy--from-amplify-console.html)。
使用 Amazon CloudFront 为 Amazon S3 上托管的静态网站提供服务。有关更多信息，请参阅[如何使用 CloudFront 为我的 Amazon S3 存储桶提供 HTTPS 请求？](https://www.amazonaws.cn/premiumsupport/knowledge-center/cloudfront-https-requests-s3) 要使用自定义域的 HTTPS，请参阅[使用注册到 Route 53 的自定义域配置静态网站](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html)。
申请方付款存储桶不允许通过网站端点进行访问。对此类存储桶的任何请求都会收到 403 拒绝访问响应。有关更多信息，请参阅 [使用申请方付款通用存储桶进行存储传输和使用](RequesterPaysBuckets.md)。

**Topics**
+ [网站端点示例](#website-endpoint-examples)
+ [添加 DNS 别名记录](#website-endpoint-dns-cname)
+ [将自定义域与 Route 53 结合使用](#custom-domain-s3-endpoint)
+ [网站端点和 REST API 端点之间的主要区别](#WebsiteRestEndpointDiff)

## 网站端点示例
<a name="website-endpoint-examples"></a>

以下示例演示如何访问配置为静态网站的 Amazon S3 存储桶。

**Example – 请求根级别的对象**  
要请求存储在存储桶根级别的特定对象，请使用以下 URL 结构。  

```
http://bucket-name.s3-website.Region.amazonaws.com/object-name
```
例如，以下 URL 请求存储在存储桶中根级别的 `photo.jpg` 对象。  

```
http://example-bucket.s3-website.us-west-2.amazonaws.com/photo.jpg
```

**Example – 请求前缀中的对象**  
要请求存储在存储桶的文件夹中的对象，请使用此 URL 结构。  

```
http://bucket-name.s3-website.Region.amazonaws.com/folder-name/object-name
```
以下 URL 请求存储桶中的 `docs/doc1.html` 对象。  

```
http://example-bucket.s3-website.us-west-2.amazonaws.com/docs/doc1.html
```

## 添加 DNS 别名记录
<a name="website-endpoint-dns-cname"></a>

如果您拥有已注册的域，则可以添加指向 Amazon S3 网站端点的 DNS CNAME 条目。例如，如果您注册了 `www.example-bucket.com` 域，则可以创建存储桶 `www.example-bucket.com`，并添加指向 `www.example-bucket.com.s3-website.Region.amazonaws.com` 的 DNS CNAME 记录。对 `http://www.example-bucket.com` 的所有请求都将路由到 `www.example-bucket.com.s3-website.Region.amazonaws.com`。

有关更多信息，请参阅 [使用 CNAME 记录自定义 Amazon S3 URL](VirtualHosting.md#VirtualHostingCustomURLs)。

## 将自定义域与 Route 53 结合使用
<a name="custom-domain-s3-endpoint"></a>

您可以使用自己的向 Amazon Route 53 注册的域（例如，`example.com`）来提供您的内容，而不是使用 Amazon S3 网站端点访问网站。您可以将 Amazon S3 与 Route 53 结合使用以在根域中托管网站。例如，如果您拥有根域 `example.com` 且在 Amazon S3 上托管您的网站，则您的网站访问者可以通过输入 `http://www.example.com` 或 `http://example.com` 从他们的浏览器访问该站点。

有关示例演练的信息，请参阅 [教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md)。

## 网站端点和 REST API 端点之间的主要区别
<a name="WebsiteRestEndpointDiff"></a>

Amazon S3 网站端点针对通过 Web 浏览器访问进行了优化。下表总结 REST API 端点和网站端点之间的主要区别。


| 主要区别 | REST API 端点 | 网站端点 | 
| --- | --- | --- | 
| 访问控制 |  同时支持公有和私有内容  | 仅支持公开可读的内容  | 
| 错误消息处理 |  返回 XML 格式的错误响应  | 返回 HTML 文档 | 
| 重定向支持 |  不适用  | 同时支持对象级和存储桶级重定向 | 
| 支持的请求  |  支持所有存储桶和对象操作  | 仅支持针对对象的 GET 和 HEAD 请求 | 
| 对存储桶根级的 GET 和 HEAD 请求的响应 | 返回存储桶中对象键的列表 | 返回在网站配置中指定的索引文档 | 
| 安全套接字层 (SSL) 支持 | 支持 SSL 连接 | 不支持 SSL 连接 | 

有关 Amazon S3 端点的完整列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon S3 端点和限额](https://docs.amazonaws.cn/general/latest/gr/s3.html)。

# 启用网站托管
<a name="EnableWebsiteHosting"></a>

将存储桶配置为静态网站时，您必须启用静态网站托管、配置索引文档和设置权限。

您可以使用 Amazon S3 控制台、REST API、Amazon SDK、Amazon CLI 或 Amazon CloudFormation 启用静态网站托管。

要使用自定义域配置您的网站，请参阅 [教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md)。

## 使用 S3 控制台
<a name="HowDoIWebsiteConfiguration"></a>

**启用静态网站托管**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要为其启用静态网站托管的存储桶的名称。

1. 选择**属性**。

1. 在**静态网站托管**下，请选择**编辑**。

1. 请选择**使用此存储桶托管网站**。

1. 在**静态网站托管**下，请选择**启用**。

1. 在 **Index document (索引文档)** 中，输入索引文档的文件名，通常为 `index.html`。

   索引文档名称区分大小写，并且必须与您计划上传到 S3 存储桶的 HTML 索引文档的文件名完全匹配。当您为网站托管配置存储桶时，您必须指定索引文档。当对根域或任何子文件夹发出请求时，Amazon S3 将返回此索引文档。有关更多信息，请参阅 [配置索引文档](IndexDocumentSupport.md)。

1. 要为 4XX 类错误提供您自己的自定义错误文档，请在**错误文档**中输入自定义错误文档文件名。

   错误文档名称区分大小写，并且必须与您计划上传到 S3 存储桶的 HTML 错误文档的文件名完全匹配。如果未指定自定义错误文档并发生错误，Amazon S3 返回默认 HTML 错误文档。有关更多信息，请参阅 [配置自定义错误文档](CustomErrorDocSupport.md)。

1. （可选）如果要指定高级重定向规则，请在 **Redirection rules**（重定向规则）中，输入 JSON 来描述规则。

   例如，您可以根据请求中的特定对象键名或前缀按条件路由请求。有关更多信息，请参阅 [配置重新导向规则以使用高级条件重新导向](how-to-page-redirect.md#advanced-conditional-redirects)。

1. 选择 **Save changes（保存更改）**。

   Amazon S3 为您的存储桶启用静态网站托管。在页面底部的**静态网站托管**下，您可以看到存储桶的网站端点。

1. 在**静态网站托管**下，记下**端点**。

   **端点**是存储桶的 Amazon S3 网站端点。将存储桶配置为静态网站后，您可以使用此端点来测试您的网站。

## 使用 REST API
<a name="ConfigWebSiteREST"></a>

有关直接发送 REST 请求以启用静态网站托管的更多信息，请参阅《Amazon Simple Storage Service API 参考》中的以下部分：
+ [PUT Bucket website](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketPUTwebsite.html)
+ [GET Bucket website](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketGETwebsite.html)
+ [DELETE Bucket website](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketDELETEwebsite.html)

## 使用 Amazon SDK
<a name="ManagingBucketWebsiteConfig"></a>

若要在 Amazon S3 上托管静态网站，需要为网站托管配置 Amazon S3 存储桶，然后将您的网站内容上传到该存储桶。您还可以使用 Amazon SDK 以编程方式创建、更新和删除网站配置。SDK 围绕 Amazon S3 REST API 提供封装类。如果应用程序需要它，可以直接从应用程序发送 REST API 请求。

------
#### [ .NET ]

以下示例说明如何使用 适用于 .NET 的 Amazon SDK 管理存储桶的网站配置。要将网站配置添加到存储桶，请提供存储桶名称和网站配置。网站配置必须包含索引文档，并且可包含可选的错误文档。这些文档必须存储在存储桶中。有关更多信息，请参阅 [PUT Bucket 网站](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketPUTwebsite.html)。有关 Amazon S3 网站功能的更多信息，请参阅 [使用 Amazon S3 托管静态网站](WebsiteHosting.md)。

以下 C\$1 代码示例将网站配置添加到指定的存储桶。该配置指定索引文档和错误文档名称。有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》**中的[适用于 .NET 的 Amazon SDK 入门](https://docs.amazonaws.cn/sdk-for-net/latest/developer-guide/net-dg-setup.html)。

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class WebsiteConfigTest
    {
        private const string bucketName = "*** bucket name ***";
        private const string indexDocumentSuffix = "*** index object key ***"; // For example, index.html.
        private const string errorDocument = "*** error object key ***"; // For example, error.html.
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;
        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            AddWebsiteConfigurationAsync(bucketName, indexDocumentSuffix, errorDocument).Wait();
        }

        static async Task AddWebsiteConfigurationAsync(string bucketName,
                                            string indexDocumentSuffix,
                                            string errorDocument)
        {
            try
            {
                // 1. Put the website configuration.
                PutBucketWebsiteRequest putRequest = new PutBucketWebsiteRequest()
                {
                    BucketName = bucketName,
                    WebsiteConfiguration = new WebsiteConfiguration()
                    {
                        IndexDocumentSuffix = indexDocumentSuffix,
                        ErrorDocument = errorDocument
                    }
                };
                PutBucketWebsiteResponse response = await client.PutBucketWebsiteAsync(putRequest);

                // 2. Get the website configuration.
                GetBucketWebsiteRequest getRequest = new GetBucketWebsiteRequest()
                {
                    BucketName = bucketName
                };
                GetBucketWebsiteResponse getResponse = await client.GetBucketWebsiteAsync(getRequest);
                Console.WriteLine("Index document: {0}", getResponse.WebsiteConfiguration.IndexDocumentSuffix);
                Console.WriteLine("Error document: {0}", getResponse.WebsiteConfiguration.ErrorDocument);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------
#### [ PHP ]

以下 PHP 示例将网站配置添加到指定的存储桶。`create_website_config` 方法显式提供索引文档和错误文档名称。该示例还检索网站配置并输出响应。有关 Amazon S3 网站功能的更多信息，请参阅 [使用 Amazon S3 托管静态网站](WebsiteHosting.md)。

有关适用于 Ruby 的 Amazon 开发工具包 API 的更多信息，请转到[适用于 Ruby 的 Amazon 开发工具包 – 版本 2](https://docs.amazonaws.cn/sdkforruby/api/index.html)。

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);


// Add the website configuration.
$s3->putBucketWebsite([
    'Bucket'                => $bucket,
    'WebsiteConfiguration'  => [
        'IndexDocument' => ['Suffix' => 'index.html'],
        'ErrorDocument' => ['Key' => 'error.html']
    ]
]);

// Retrieve the website configuration.
$result = $s3->getBucketWebsite([
    'Bucket' => $bucket
]);
echo $result->getPath('IndexDocument/Suffix');

// Delete the website configuration.
$s3->deleteBucketWebsite([
    'Bucket' => $bucket
]);
```

------

## 使用 Amazon CLI
<a name="enabling-website-cli"></a>

有关使用 Amazon CLI 将 S3 存储桶配置为静态网站的更多信息，请参阅《*Amazon CLI 命令参考*》中的[网站](https://docs.amazonaws.cn/cli/latest/reference/s3/website.html)。

接下来，您必须配置索引文档并设置权限。有关信息，请参阅 [配置索引文档](IndexDocumentSupport.md) 和 [设置访问网站的权限](WebsiteAccessPermissionsReqd.md)。

还可以有选择性地配置[错误文档](CustomErrorDocSupport.md)、[Web 流量日志记录](LoggingWebsiteTraffic.md)或[重定向](how-to-page-redirect.md)。

# 配置索引文档
<a name="IndexDocumentSupport"></a>

启用网站托管时，还必须配置和上传索引文档。*索引文档* 是在对网站的根或任何子文件夹发出请求时 Amazon S3 返回的网页。例如，如果用户在浏览器中输入 `http://www.example.com`，则该用户没有请求任何特定页面。在这种情况下，Amazon S3 将提供索引文档，该文档有时也可称为*默认页面*。

当您为存储桶启用静态网站托管时，您可以输入索引文档的名称（例如，`index.html`）。为存储桶启用静态网站托管后，您可以将具有索引文档名称的 HTML 文件上传到存储桶。

根级 URL 的尾部斜杠是可选的。例如，如果您将具有 `index.html` 的网站配置为索引文档，以下任意一个 URL 将返回 `index.html`。

```
1. http://example-bucket.s3-website.Region.amazonaws.com/
2. http://example-bucket.s3-website.Region.amazonaws.com
```

有关 Amazon S3 网站端点的更多信息，请参阅 [网站端点](WebsiteEndpoints.md)。

## 索引文档和文件夹
<a name="IndexDocumentsandFolders"></a>

在 Amazon S3 中，存储桶是对象的平面容器。它不会像计算机上的文件系统那样提供任何分层组织。但是，您可以通过使用表示文件夹结构的对象键名创建逻辑层级结构。

例如，考虑具有三个对象（具有以下键名）的存储桶。虽然它们没有按任何物理分层组织进行存储，但您可以从键名推断以下逻辑文件夹结构：
+ `sample1.jpg` — 对象位于存储桶的根级。
+ `photos/2006/Jan/sample2.jpg` — 对象位于 `photos/2006/Jan` 子文件夹中。
+ `photos/2006/Feb/sample3.jpg` — 对象位于 `photos/2006/Feb` 子文件夹中。

在 Amazon S3 控制台中，您还可以在存储桶中创建文件夹。例如，您可以创建名为 `photos` 的文件夹。您可以将对象上传到存储桶或该存储桶中的 `photos` 文件夹。如果您将对象 `sample.jpg` 添加到存储桶，则键名为 `sample.jpg`。如果您将对象上传到 `photos` 文件夹，则对象键名为 `photos/sample.jpg`。

如果您在存储桶中创建了文件夹结构，则您必须在每个级别上都具有索引文档。在每个文件夹中，索引文档必须具有相同的名称，例如，`index.html`。当用户指定类似于文件夹查找的 URL 时，是否存在尾部斜杠将决定网站的行为。例如，以下具有尾部反斜杠的 URL 将返回 `photos/index.html` 索引文档。

```
1. http://bucket-name.s3-website.Region.amazonaws.com/photos/
```

但是，如果您从之前的 URL 排除了尾部斜杠，则 Amazon S3 将首先在存储段中查找对象 `photos`。如果未找到 `photos` 对象，它将搜索索引文档 `photos/index.html`。如果找到该文档，则 Amazon S3 将返回 `302 Found` 消息并指向 `photos/` 密钥。对于对 `photos/` 的后续请求，Amazon S3 将返回 `photos/index.html`。如果未找到索引文档，Amazon S3 将返回错误。

## 配置索引文档
<a name="configuring-index-document"></a>

要使用 S3 控制台配置索引文档，请使用以下步骤。您还可以使用 REST API、Amazon SDK、Amazon CLI 或 Amazon CloudFormation 配置索引文档。

**注意**  
在启用版本控制的存储桶中，您可以上传 `index.html` 的多个副本，但只解析为最新的版本。有关使用 S3 版本控制的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

当您为存储桶启用静态网站托管时，您可以输入索引文档的名称（例如，**index.html**）。为存储桶启用静态网站托管后，您可以将具有此索引文档名称的 HTML 文件上传到存储桶。

**配置索引文档**

1. 创建 `index.html` 文件。

   如果您没有 `index.html` 文件，则可以使用以下 HTML 创建一个：

   ```
   <html xmlns="http://www.w3.org/1999/xhtml" >
   <head>
       <title>My Website Home Page</title>
   </head>
   <body>
     <h1>Welcome to my website</h1>
     <p>Now hosted on Amazon S3!</p>
   </body>
   </html>
   ```

1. 将索引文件保存在本地。

   索引文档文件名必须与您在**静态网站托管**对话框中输入的索引文档名称完全匹配。索引文档名称区分大小写。例如，如果在**静态网站托管**对话框中为**索引文档**名称输入 `index.html`，则索引文档文件名也必须是 `index.html`，而不是 `Index.html`。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要用于托管静态网站的存储桶的名称。

1. 为您的存储桶启用静态网站托管，并输入索引文档的确切名称（例如 `index.html`）。有关更多信息，请参阅 [启用网站托管](EnableWebsiteHosting.md)。

   启用静态网站托管后，继续执行步骤 6。

1. 要将索引文档上传到存储桶，请执行以下操作之一：
   + 将索引文件拖放到控制台存储桶列表中。
   + 选择**上传**，然后按照提示选择并上传索引文件。

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

1. （可选）将其他网站内容上传到您的存储桶。

接下来，您必须设置用于访问网站的权限。有关信息，请参阅 [设置访问网站的权限](WebsiteAccessPermissionsReqd.md)。

还可以有选择性地配置[错误文档](CustomErrorDocSupport.md)、[Web 流量日志记录](LoggingWebsiteTraffic.md)或[重定向](how-to-page-redirect.md)。

# 配置自定义错误文档
<a name="CustomErrorDocSupport"></a>

将存储桶配置为静态网站后，当出现错误时，Amazon S3 返回 HTML 错误文档。您可以选择使用自定义错误文档配置存储桶，以便在发生错误时 Amazon S3 返回该文档。

**注意**  
当出现错误时，某些浏览器将显示自己的错误消息，而忽略 Amazon S3 返回的错误文档。例如，当出现 HTTP 404 Not Found (HTTP 404 未找到) 错误时，Google Chrome 可能忽略 Amazon S3 返回的错误文档并显示自己的错误。

**Topics**
+ [Amazon S3 HTTP 响应代码](#s3-http-error-codes)
+ [配置自定义错误文档](#custom-error-document)

## Amazon S3 HTTP 响应代码
<a name="s3-http-error-codes"></a>

下表列出了出现错误时 Amazon S3 返回的 HTTP 响应代码的子集。


| HTTP 错误代码 | 描述 | 
| --- | --- | 
| 301 永久移动 | 当用户将请求直接发送到 Amazon S3 网站端点（http://s3-website.Region.amazonaws.com/）时，Amazon S3 将返回 301 Moved Permanently（301 永久移动）响应并将这些请求重定向到 https://aws.amazon.com/s3/。 | 
| 302 Found (302 已找到 |  当 Amazon S3 接收对不包含尾部斜杠的键 `x` (`http://bucket-name.s3-website.Region.amazonaws.com/x`) 的请求时，它首先查找键名为 `x` 的对象。如果未找到对象，则 Amazon S3 确定该请求是针对子文件夹 `x` 发出的，并通过在末尾添加斜杠重定向请求并返回 **302 Found (302 已找到)**。  | 
| 304 Not Modified (304 未修改 |  Amazon S3 使用请求标头 `If-Modified-Since`、`If-Unmodified-Since`、`If-Match` 和/或 `If-None-Match` 来确定请求的对象与客户端具有的缓存副本是否相同。如果对象相同，网站端点将返回 **304 Not Modified** 响应。  | 
| 400 Malformed Request |  当用户尝试通过错误的地区端点访问存储桶时，网站端点的响应包含 **400 Malformed Request**。  | 
| 403 禁止访问 |  当用户请求转换为不可公开读取的对象时，网站端点的响应包含 **403 禁止访问**。对象所有者必须使用存储桶策略或 ACL 使该对象公开可读。  | 
| 404 未找到 |  由于以下原因，网站端点的响应包含 **404 Not Found**： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/CustomErrorDocSupport.html) 您可以创建为 **404 Not Found** 返回的自定义文档。确保该文档已上传到配置为网站的存储桶，且网站托管配置已设置为使用该文档。 有关 Amazon S3 如何将 URL 当作对对象或索引文档的请求的信息，请参阅 [配置索引文档](IndexDocumentSupport.md)。  | 
| 500 Service Error |  当出现内部服务器错误时，网站端点的响应包含 **500 Service Error**。  | 
| 503 服务不可用 |  当 Amazon S3 确定您需要降低请求率时，网站端点的响应包含 **503 Service Unavailable（503 服务不可用）**。  | 

 对于其中每个错误，Amazon S3 都返回一条预定义的 HTML 消息。以下是对 **403 Forbidden** 响应返回的 HTML 消息示例。

![\[“403 Forbidden”(403 禁止访问) 错误消息示例\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/WebsiteErrorExample403.png)


## 配置自定义错误文档
<a name="custom-error-document"></a>

将存储桶配置为静态网站时，您可以提供包含用户友好错误消息和其他帮助的自定义错误文档。Amazon S3 将仅为 HTTP 4XX 类的错误代码返回您的自定义错误文档。

要使用 S3 控制台配置自定义错误文档，请执行以下步骤。您还可以使用 REST API、Amazon SDK、Amazon CLI 或 Amazon CloudFormation 配置错误文档。有关更多信息，请参阅下列内容：
+ 《Amazon Simple Storage Service API 参考》**中的 [PutBucketWebsite](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutBucketWebsite.html)
+ 《*Amazon CloudFormation 用户指南*》中的 [AWS::S3::Bucket WebsiteConfiguration](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-websiteconfiguration.html)
+ 《*Amazon CLI 命令参考*》中的 [put-bucket-website](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-website.html)

当您为存储桶启用静态网站托管时，请输入错误文档的名称（例如，**404.html**）。为存储桶启用静态网站托管后，您可以将具有此错误文档名称的 HTML 文件上传到存储桶。

**要配置错误文档**

1. 创建错误文档，例如 `404.html`。

1. 将错误文档文件保存在本地。

   错误文档名称区分大小写，必须与启用静态网站托管时输入的名称完全匹配。例如，如果在**静态网站托管**对话框中为**错误文档**名称输入 `404.html`，则错误文档文件名也必须是 `404.html`。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要用于托管静态网站的存储桶的名称。

1. 为您的存储桶启用静态网站托管，并输入错误文档的确切名称（例如 `404.html`）。有关更多信息，请参阅[启用网站托管](EnableWebsiteHosting.md)和[配置自定义错误文档](#CustomErrorDocSupport)。

   启用静态网站托管后，继续执行步骤 6。

1. 要将错误文档上传到存储桶，请执行以下操作之一：
   + 将错误文档文件拖放到控制台存储桶列表中。
   + 选择**上传**，然后按照提示选择并上传索引文件。

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

# 设置访问网站的权限
<a name="WebsiteAccessPermissionsReqd"></a>

将存储桶配置为静态网站时，如果希望网站成为公有网站，则可以授予公有读取访问权限。要使存储桶公开可读，您必须禁用存储桶的阻止公有访问设置并编写一条授予公有读取访问权限的存储桶策略。如果存储桶包含并非由存储桶拥有者拥有的对象，您可能还需要添加对象访问控制列表 (ACL)，以便向所有人授予读取访问权限。

如果您不想禁用存储桶的阻止公共访问设置，但仍希望将自己的网站公开，则可以创建 Amazon CloudFront 分配来为静态网站提供服务。有关更多信息，请参阅[使用 Amazon CloudFront 为网站提速](website-hosting-cloudfront-walkthrough.md)或《Amazon Route 53 开发人员指南》**中的[使用 Amazon CloudFront 分配为静态网站提供服务](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/getting-started-cloudfront-overview.html)。

**注意**  
在网站端点上，如果用户请求了不存在的对象，则 Amazon S3 将返回 HTTP 响应代码 `404 (Not Found)`。如果该对象存在，但您尚未授予对对象的读取权限，则网站端点将返回 HTTP 响应代码 `403 (Access Denied)`。用户可以使用该响应代码推断特定对象是否存在。如果您不需要此行为，则不应启用对存储桶的网站支持。

**Topics**
+ [步骤 1：编辑 S3 阻止公有访问设置](#block-public-access-static-site)
+ [步骤 2：添加存储桶策略](#bucket-policy-static-site)
+ [对象访问控制列表](#object-acl)

## 步骤 1：编辑 S3 阻止公有访问设置
<a name="block-public-access-static-site"></a>

如果要将现有存储桶配置为具有公有访问权限的静态网站，您必须编辑该存储桶的阻止公有访问设置。您可能还必须编辑账户级别的阻止公有访问设置。Amazon S3 会应用限制性最强的存储桶级别和账户级别的阻止公有访问设置的组合。

例如，如果您允许对存储桶进行公有访问，但阻止账户级别的所有公有访问权限，则 Amazon S3 将继续阻止对存储桶进行公有访问。在这种情况下，您将必须编辑存储桶级别和账户级别的阻止公有访问设置。有关更多信息，请参阅 [阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

默认情况下，Amazon S3 阻止对您的账户和存储桶的公有访问权限。如果要使用存储桶托管静态网站，您可以使用以下步骤编辑您的屏蔽公共访问权限设置。

**警告**  
在完成这些步骤之前，请查看[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)，来确保您了解并接受支持公共访问权限所涉及的风险。当您关闭屏蔽公共访问权限设置以使您的存储桶变为公有时，Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 请选择已配置为静态网站的存储桶的名称。

1. 选择**权限**。

1. 在**屏蔽公共访问权限（存储桶设置）**下，请选择**编辑**。

1. 清除**阻止*所有*公有访问**，然后选择**保存更改**。  
![\[Amazon S3 控制台，显示屏蔽公共访问权限存储桶设置。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/edit-public-access-clear.png)

   Amazon S3 关闭了存储桶的屏蔽公共访问权限设置。要创建公有静态网站，可能还必须[为您的账户配置屏蔽公共访问权限设置](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/block-public-access-account.html)，然后再添加存储桶策略。如果当前已开启账户的屏蔽公共访问权限设置，您将在**屏蔽公共访问权限（存储桶设置）**下看到一条备注。

## 步骤 2：添加存储桶策略
<a name="bucket-policy-static-site"></a>

要使存储桶中的对象公开可读，您必须编写一条向所有人授予 `s3:GetObject` 权限的存储桶策略。

在编辑 S3 阻止公有访问设置后，您可以添加存储桶策略以授予对存储桶的公有读取访问权限。当您授予公有读取访问权限时，Internet 上的任何人都可以访问您的存储桶。

**重要**  
下面的策略仅供举例说明，仍允许完全访问您存储桶的内容。在继续执行此步骤之前，请查看[如何保护 Amazon S3 存储桶中的文件？](https://www.amazonaws.cn/premiumsupport/knowledge-center/secure-s3-resources/)，以确保您了解保护 S3 存储桶中文件的最佳实践以及授予公有访问权限所涉及的风险。

1. 在**存储桶** 下，请选择存储桶的名称。

1. 选择**权限**。

1. 在**存储桶策略**下，请选择**编辑**。

1. 要授予对网站的公有读取访问权限，请复制以下存储桶策略，将其粘贴到**存储桶策略编辑器**中。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PublicReadGetObject",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::Bucket-Name/*"
               ]
           }
       ]
   }
   ```

1. 将 `Resource` 更新为您的存储桶名称。

   在上述示例存储桶策略中，*Bucket-Name* 是存储桶名称的占位符。要将此存储桶策略用于您自己的存储桶，您必须更新此名称以匹配您的存储桶名称。

1. 选择**保存更改**。

   此时将显示一条消息，指示存储桶策略已成功添加。

   如果您看到显示 `Policy has invalid resource` 的错误，请确认存储桶策略中的存储桶名称与您的存储桶名称匹配。有关添加存储桶策略的信息，请参阅[如何添加 S3 存储桶策略？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/add-bucket-policy.html)

   如果您收到错误消息且无法保存存储桶策略，请检查您的账户和存储桶的阻止公有访问设置以确认您允许对存储桶进行公有访问。

## 对象访问控制列表
<a name="object-acl"></a>

您可以使用存储桶策略来授予对对象的公共读取权限。但是，存储桶策略仅适用于存储桶拥有者所拥有的对象。如果存储桶包含并非由存储桶拥有者拥有的对象，则存储桶拥有者应使用对象访问控制列表 (ACL) 授予对这些对象的公有 READ 权限。

S3 对象所有权是 Amazon S3 存储桶级别的设置，您可以使用该设置来控制上传到存储桶的对象的所有权和禁用或启用 ACL。默认情况下，对象所有权设为强制存储桶拥有者设置，并且所有 ACL 均处于禁用状态。禁用 ACL 后，存储桶拥有者拥有存储桶中的所有对象，并使用访问管理策略来专门管理对这些对象的访问权限。

 Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态，除非有需要单独控制每个对象的访问权限的情况。禁用 ACL 后，您可以使用策略来控制对存储桶中所有对象的访问权限，无论是谁将对象上传到您的存储桶。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

**重要**  
如果通用存储桶针对 S3 对象所有权使用强制存储桶拥有者设置，则必须使用策略来授予对通用存储桶及其中对象的访问权限。启用强制存储桶拥有者设置后，设置访问控制列表（ACL）或更新 ACL 的请求将失败并返回 `AccessControlListNotSupported` 错误代码。我们仍然支持读取 ACL 的请求。

要使用 ACL 使对象公开可读，您可以向 `AllUsers` 组授予 READ 权限，如以下授权元素所示。可以将此授权元素添加到对象 ACL 中。有关管理 ACL 的信息，请参阅 [访问控制列表 (ACL) 概述](acl-overview.md)。

```
1. <Grant>
2.   <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.           xsi:type="Group">
4.     <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
5.   </Grantee>
6.   <Permission>READ</Permission>
7. </Grant>
```

# （可选）记录 Web 流量
<a name="LoggingWebsiteTraffic"></a>

您可以选择为配置为静态网站的存储桶启用 Amazon S3 服务器访问日志记录。服务器访问日志记录详细地记录了对您的存储桶提出的各种请求。有关更多信息，请参阅 [使用服务器访问日志记录来记录请求](ServerLogs.md)。如果您计划使用 Amazon CloudFront 来[为网站提速](website-hosting-cloudfront-walkthrough.md)，也可以使用 CloudFront 日志记录。有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[配置和使用访问日志](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)。

**为静态网站存储桶启用服务器访问日志记录**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 例如，在您创建存储桶（配置为静态网站）的同一区域中，创建用于日志记录的通用存储桶（例如 `logs.example.com`）。

1. 为服务器访问日志记录日志文件创建文件夹（例如，`logs`）。

1. （可选）如果要使用 CloudFront 提高网站性能，请为 CloudFront 日志文件创建一个文件夹（例如，`cdn`）。

   有关更多信息，请参阅 [使用 Amazon CloudFront 为网站提速](website-hosting-cloudfront-walkthrough.md)。

1. 在 **Buckets (存储桶)** 列表中，请选择您的存储桶。

1. 请选择**属性**。

1. 在 **Server access logging**（服务器访问日志记录）下，请选择 **Edit**（编辑）。

1. 请选择 **Enable**。

1. 在 **Target bucket**（目标存储桶）下，请选择服务器访问日志的存储桶和文件夹目标：
   + 浏览到文件夹和存储桶位置：

     1. 请选择 **Browse S3**（浏览 S3）。

     1. 请选择存储桶名称，然后选择日志文件夹。

     1. 请选择 **Choose path**（选择路径）。
   + 输入 S3 存储桶路径，例如 **s3://logs.example.com/logs/**。

1. 选择**保存更改**。

   在日志存储桶中，您现在可以访问日志。Amazon S3 每 2 小时将网站访问日志写入您的日志存储桶一次。

# （可选）配置网页重定向
<a name="how-to-page-redirect"></a>

如果为静态网站托管配置了 Amazon S3 存储桶，您可以为存储桶或其中的对象配置重新导向。您可以使用以下选项来配置重新导向。

**Topics**
+ [针对存储桶的网站端点的请求重新导向到另一个存储桶或域](#redirect-endpoint-host)
+ [配置重新导向规则以使用高级条件重新导向](#advanced-conditional-redirects)
+ [重新导向对于对象的请求](#redirect-requests-object-metadata)

## 针对存储桶的网站端点的请求重新导向到另一个存储桶或域
<a name="redirect-endpoint-host"></a>

您可以将针对存储桶的网站端点的所有请求重新导向到另一个存储桶或域。如果您重新导向所有请求，则对网站端点所做的任何请求都将重新导向至指定的存储桶或域。

例如，假设您的根域为 `example.com`，而您需要服务 `http://example.com` 和 `http://www.example.com` 的请求，则必须创建两个分别名为 `example.com` 和 `www.example.com` 的存储桶。然后，将内容保留在 `example.com` 存储桶中，然后配置另一个 `www.example.com` 存储桶以将所有请求重定向至 `example.com` 存储桶。有关更多信息，请参阅[使用自定义域名配置静态网站](https://docs.amazonaws.cn/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html)。

**重定向对存储桶网站端点的请求**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在 **Buckets**（存储桶）下，请选择要从中重定向请求的存储桶的名称（例如 `www.example.com`）。

1. 请选择**属性**。

1. 在**静态网站托管**下，选择**编辑**。

1. 请选择 **Redirect requests for an object**（重定向对于对象的请求）。

1. 在 **Host name（主机名）**框中，输入存储桶或自定义域的网站端点。

   例如，如果您正在重定向到根域地址，则输入 **example.com**。

1. 对于 **Protocol**（协议），请选择重定向请求的协议（**none**（无）、**http** 或 **https**）。

   如果未指定协议，则默认选项为 **none (无)**。

1. 选择**保存更改**。

## 配置重新导向规则以使用高级条件重新导向
<a name="advanced-conditional-redirects"></a>

利用高级重定向规则，您可以根据特定对象键名、请求中的前缀或者响应代码来按条件路由请求。例如，假设您在存储桶中删除或重命名了某个对象。您可以添加一个将请求重定向到其他对象的路由规则。如果您要使文件夹不可用，则可以添加路由规则将请求重定向至其他网页。处理错误时，您还可以通过将返回错误的请求路由到其他域来添加一个处理错误条件的路由规则。

当为存储桶启用静态网站托管时，您可以选择指定高级重新导向规则。Amazon S3 对每个网站配置的路由规则限制为 50 条。如果您需要 50 个以上的路由规则，则可以使用对象重定向。有关更多信息，请参阅 [使用 S3 控制台](#page-redirect-using-console)。

有关使用 REST API 配置路由规则的更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [PutBucketWebsite](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutBucketWebsite.html)。

**重要**  
要在新的 Amazon S3 控制台中创建重定向规则，您必须使用 JSON。有关 JSON 示例，请参阅[重定向规则示例](#redirect-rule-examples)。

**为静态网站配置重定向规则**

要为已启用静态网站托管的存储桶添加重定向规则，请执行以下步骤。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择已配置为静态网站的存储桶的名称。

1. 请选择**属性**。

1. 在 **Static website hosting**（静态网站托管）下，请选择 **Edit (编辑)**。

1. 在 **Redirection rules (重定向规则)** 框中，输入使用 JSON 的重定向规则。

   在 S3 控制台中，您可以使用 JSON 描述规则。有关 JSON 示例，请参阅[重定向规则示例](#redirect-rule-examples)。Amazon S3 对每个网站配置的路由规则限制为 50 条。

1. 选择**保存更改**。

### 路由规则元素
<a name="configure-bucket-as-website-routing-rule-syntax"></a>

以下是在 JSON 和 XML 中的网站配置中定义路由规则的一般语法。要在新的 S3 控制台中配置重定向规则，必须使用 JSON。有关 JSON 示例，请参阅[重定向规则示例](#redirect-rule-examples)。

------
#### [ JSON ]

```
[
    {
      "Condition": {
        "HttpErrorCodeReturnedEquals": "string",
        "KeyPrefixEquals": "string"
      },
      "Redirect": {
        "HostName": "string",
        "HttpRedirectCode": "string",
        "Protocol": "http"|"https",
        "ReplaceKeyPrefixWith": "string",
        "ReplaceKeyWith": "string"
      }
    }
  ]
 
Note: Redirect must each have at least one child element. You can have either ReplaceKeyPrefix with or ReplaceKeyWith but not both.
```

------
#### [ XML ]

```
<RoutingRules> =
    <RoutingRules>
         <RoutingRule>...</RoutingRule>
         [<RoutingRule>...</RoutingRule>   
         ...]
    </RoutingRules>

<RoutingRule> =
   <RoutingRule>
      [ <Condition>...</Condition> ]
      <Redirect>...</Redirect>
   </RoutingRule>

<Condition> =
   <Condition> 
      [ <KeyPrefixEquals>...</KeyPrefixEquals> ]
      [ <HttpErrorCodeReturnedEquals>...</HttpErrorCodeReturnedEquals> ]
   </Condition>
    Note: <Condition> must have at least one child element.

<Redirect> =
   <Redirect> 
      [ <HostName>...</HostName> ]
      [ <Protocol>...</Protocol> ]
      [ <ReplaceKeyPrefixWith>...</ReplaceKeyPrefixWith>  ]
      [ <ReplaceKeyWith>...</ReplaceKeyWith> ]
      [ <HttpRedirectCode>...</HttpRedirectCode> ]
   </Redirect>

Note: <Redirect> must have at least one child element. You can have either ReplaceKeyPrefix with or ReplaceKeyWith but not both.
```

------

下表描述了路由规则中的元素。


|  名称  |  描述  | 
| --- | --- | 
| RoutingRules |  用于收集 RoutingRule 元素的容器。 | 
| RoutingRule |  标识在满足条件时应用的条件和重定向的规则。 条件： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/how-to-page-redirect.html)  | 
| Condition |  对于要应用的指定的重定向，用于描述必须满足的条件的容器。如果路由规则不包含条件，则该规则将应用于所有请求。  | 
| KeyPrefixEquals |  从中重定向请求的对象键名的前缀。 `KeyPrefixEquals`如果未指定 `HttpErrorCodeReturnedEquals`，则需要 。如果同时指定 `KeyPrefixEquals` 和 `HttpErrorCodeReturnedEquals`，则两者都必须为真才能满足条件。  | 
| HttpErrorCodeReturnedEquals |  要应用的重定向必须匹配的 HTTP 错误代码。如果出现错误，并且错误代码满足此值，则应用指定的重定向。 `HttpErrorCodeReturnedEquals`如果未指定 `KeyPrefixEquals`，则需要 。如果同时指定 `KeyPrefixEquals` 和 `HttpErrorCodeReturnedEquals`，则两者都必须为真才能满足条件。  | 
| Redirect |  提供用于重定向请求的说明的容器元素。您可以将请求重定向到其他主机或其他页面，或者也可以指定要使用的其他协议。`RoutingRule` 必须具有 `Redirect` 元素。`Redirect` 元素必须至少包含以下一个同级元素：`Protocol`、`HostName`、`ReplaceKeyPrefixWith`、`ReplaceKeyWith` 或 `HttpRedirectCode`。  | 
| Protocol |  响应中返回的 `http` 标头中将要使用的协议（`https` 或 `Location`）。 如果提供了一个同级，则 `Protocol` 不是必需的。  | 
| HostName |  可在响应中返回的 `Location` 标头中使用的主机名。 如果提供了一个同级，则 `HostName` 不是必需的。  | 
| ReplaceKeyPrefixWith |  将替换重定向请求中的 `KeyPrefixEquals` 值的对象键名的前缀。 如果提供了一个同级，则 `ReplaceKeyPrefixWith` 不是必需的。仅在不提供 `ReplaceKeyWith` 时提供它。  | 
| ReplaceKeyWith |  可在响应中返回的 `Location` 标头中使用的对象键。 如果提供了一个同级，则 `ReplaceKeyWith` 不是必需的。仅在不提供 `ReplaceKeyPrefixWith` 时提供它。  | 
| HttpRedirectCode |  可在响应中返回的 `Location` 标头中使用的 HTTP 重定向代码。 如果提供了一个同级，则 `HttpRedirectCode` 不是必需的。  | 

#### 重定向规则示例
<a name="redirect-rule-examples"></a>

以下示例介绍了常见的重定向任务：

**重要**  
要在新的 Amazon S3 控制台中创建重定向规则，您必须使用 JSON。

**Example 1：保留键前缀后进行重定向**  
假设您的存储桶包含以下对象：  
+ index.html
+ docs/article1.html
+ docs/article2.html
您决定将文件夹从 `docs/` 重命名为 `documents/`。做出此更改后，您需要将对前缀 `docs/` 的请求重定向至 `documents/`。例如，对 `docs/article1.html` 的请求将重定向至 `documents/article1.html`。  
在这种情况下，您可以将以下路由规则添加到网站配置。  

```
[
    {
        "Condition": {
            "KeyPrefixEquals": "docs/"
        },
        "Redirect": {
            "ReplaceKeyPrefixWith": "documents/"
        }
    }
]
```

```
  <RoutingRules>
    <RoutingRule>
    <Condition>
      <KeyPrefixEquals>docs/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith>documents/</ReplaceKeyPrefixWith>
    </Redirect>
    </RoutingRule>
  </RoutingRules>
```

**Example 2：将对已删除文件夹的请求重定向到页面**  
假设您删除了 `images/` 文件夹 (即，删除了具有键前缀 `images/` 的所有对象)。您可以添加路由规则以将具有键前缀 `images/` 的任何对象的请求重定向至名为 `folderdeleted.html` 的页。  

```
[
    {
        "Condition": {
            "KeyPrefixEquals": "images/"
        },
        "Redirect": {
            "ReplaceKeyWith": "folderdeleted.html"
        }
    }
]
```

```
  <RoutingRules>
    <RoutingRule>
    <Condition>
       <KeyPrefixEquals>images/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>folderdeleted.html</ReplaceKeyWith>
    </Redirect>
    </RoutingRule>
  </RoutingRules>
```

**Example 3：重定向到具有特定路径的另一个域**  
假设您想要将针对特定路径的请求重定向到另一个域。例如，您想要将针对 `/redirect/me` 的请求重定向到 `https://example.com/new/path`。  
同时使用 `HostName` 和 `ReplaceKeyWith` 时，Amazon S3 通过在主机名和替换键之间用正斜杠进行连接来构造重定向 URL。因此，不应在 `ReplaceKeyWith` 值中包含前导斜杠。Amazon S3 会自动在主机名和替换键之间添加正斜杠。  

```
[
    {
        "Condition": {
            "KeyPrefixEquals": "redirect/me"
        },
        "Redirect": {
            "HostName": "example.com",
            "ReplaceKeyWith": "new/path"
        }
    }
]
```

```
  <RoutingRules>
    <RoutingRule>
    <Condition>
      <KeyPrefixEquals>redirect/me</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <HostName>example.com</HostName>
      <ReplaceKeyWith>new/path</ReplaceKeyWith>
    </Redirect>
    </RoutingRule>
  </RoutingRules>
```
此配置将针对 `https://yourbucket.s3-website-region.amazonaws.com/redirect/me` 的请求重定向到 `https://example.com/new/path`。请注意，`ReplaceKeyWith` 设置为 `new/path`，不带前导斜杠。

**Example 4：为 HTTP 错误进行重定向**  
假设在未找到请求的对象时，您需要将请求重定向到 Amazon Elastic Compute Cloud (Amazon EC2) 实例。添加重定向规则，以便当返回 HTTP 状态代码 404 (未找到) 时，站点访问者可重定向到将处理该请求的 Amazon EC2 实例。  
以下示例也将在重定向中插入对象键前缀 `report-404/`。例如，如果您请求了页面 `ExamplePage.html` 并且它导致了 HTTP 404 错误，该请求将重定向到指定 Amazon EC2 实例上的 `report-404/ExamplePage.html` 页面。如果没有路由规则且发生了 HTTP 错误 404，将返回配置中指定的错误文档。  

```
[
    {
        "Condition": {
            "HttpErrorCodeReturnedEquals": "404"
        },
        "Redirect": {
            "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
            "ReplaceKeyPrefixWith": "report-404/"
        }
    }
]
```

```
  <RoutingRules>
    <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals >
    </Condition>
    <Redirect>
      <HostName>ec2-11-22-333-44.compute-1.amazonaws.com</HostName>
      <ReplaceKeyPrefixWith>report-404/</ReplaceKeyPrefixWith>
    </Redirect>
    </RoutingRule>
  </RoutingRules>
```

## 重新导向对于对象的请求
<a name="redirect-requests-object-metadata"></a>

您可以通过在对象的元数据中设置网站重定向位置，以将对于对象的请求重定向到另一个对象或 URL。您可以通过将 `x-amz-website-redirect-location` 属性添加到对象元数据来设置重定向。在 Amazon S3 控制台上，您可以在对象的元数据中设置 **Website Redirect Location (网站重定向位置)**。如果您使用 [Amazon S3 API](#page-redirect-using-rest-api)，请设置 `x-amz-website-redirect-location`。然后，该网站将该对象解释为 301 重定向。

要重定向对其他对象的请求，您可以将重定向位置设置为目标对象的键。要重定向对外部 URL 的请求，您可以将重定向位置设置为所需的 URL。有关对象元数据的更多信息，请参阅 [系统定义的对象元数据](UsingMetadata.md#SysMetadata)。

当您设置页面重定向时，您可以保留或删除源对象内容。例如，如果您的存储桶中有一个 `page1.html` 对象，则可以将针对此页面的任何请求重定向到另一个对象 `page2.html`。您有两种选择：
+ 保留 `page1.html` 对象的内容和重定向页面请求。
+ 删除 `page1.html` 的内容并上传名为 `page1.html` 的零字节对象以替换现有对象和重定向页面请求。

### 使用 S3 控制台
<a name="page-redirect-using-console"></a>

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在 **Buckets**（存储桶）列表中，请选择已配置为静态网站的存储桶的名称（例如 `example.com`）。

1. 在 **Objects (对象)** 下，选择您的对象。

1. 请选择 **Actions**（操作），然后选择 **Edit metadata**（编辑元数据）。

1. 请选择 **Metadata**（元数据）。

1. 请选择 **Add Metadata**（添加元数据）。

1. 在 **Type**（类型）下，请选择 **System Defined**（系统定义）。

1. 在 **Key (键)** 中，请选择 **x-amz-website-redirect-location**。

1. 在 **Value (值)**中，输入要重定向到的对象的键名，例如 `/page2.html`。

   对于同一存储桶中的另一个对象，值中的 `/` 前缀是必需的。您也可以将该值设置为外部 URL，例如 `http://www.example.com`。

1. 请选择 **Edit metadata**（编辑元数据）。

### 使用 REST API
<a name="page-redirect-using-rest-api"></a>

以下 Amazon S3 API 操作支持请求中的 `x-amz-website-redirect-location` 标头。Amazon S3 存储对象元数据中的标头值作为 `x-amz-website-redirect-location`。
+ [PUT Object](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectPUT.html)
+ [开始分段上传](https://docs.amazonaws.cn/AmazonS3/latest/API/mpUploadInitiate.html)
+ [POST 对象](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectPOST.html)
+ [PUT Object – 复制](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectCOPY.html)

为网站托管配置的存储桶具有网站端点和 REST 端点。对配置为 301 重定向的页面的请求具有以下可能的结果，具体取决于请求的端点：
+ **特定于区域的网站端点 – **Amazon S3 根据 `x-amz-website-redirect-location` 属性的值重定向页面请求。
+ **REST 端点 – **Amazon S3 不会重定向页面请求。它将返回请求的对象。

有关端点的更多信息，请参阅 [网站端点和 REST API 端点之间的主要区别](WebsiteEndpoints.md#WebsiteRestEndpointDiff)。

设置页面重定向时，您可以保留或删除对象内容。例如，假设您的存储桶中有 `page1.html` 对象。
+ 若要保留 `page1.html` 的内容并仅重定向页面请求，您可以提交 [PUT 对象 – 复制](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectCOPY.html)请求来创建新的 `page1.html` 对象，该对象使用现有 `page1.html` 对象作为源。在您的请求中，您可以设置 `x-amz-website-redirect-location` 标头。当请求完成时，您将拥有未更改其内容的原始页面，但 Amazon S3 会将对该页面的任何请求重定向到您指定的重定向位置。
+ 要删除 `page1.html` 对象的内容并重定向对该页面的请求，您可以发送 PUT Object 请求，以上传具有相同对象键的零字节对象 `page1.html`。在 PUT 请求中，您可以将 `x-amz-website-redirect-location` 的 `page1.html` 设置为新对象。当请求完成时，`page1.html` 将不包含任何内容，且后续请求将被重定向到由 `x-amz-website-redirect-location` 指定的位置。

当使用 [GET Object](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectGET.html) 操作以及其他对象元数据检索该对象时，Amazon S3 在响应中返回 `x-amz-website-redirect-location` 标头。

# 使用跨源资源共享 (CORS)
<a name="cors"></a>

跨源资源共享 (CORS) 定义了在一个域中加载的客户端 Web 应用程序与另一个域中的资源交互的方式。借助 CORS 支持，您可以使用 Amazon S3 构建各种富客户端 Web 应用程序，并选择性地允许跨源访问您的 Amazon S3 资源。

本部分提供 CORS 概述。副主题介绍如何通过使用 Amazon S3 控制台或通过以编程方式使用 Amazon S3 REST API 和 Amazon SDK 来启用 CORS。

## 跨源资源共享：使用案例场景
<a name="example-scenarios-cors"></a>

以下是有关使用 CORS 的示例场景。

**方案 1**  
假设您在名为 `website` 的 Amazon S3 存储桶中托管网站（如 [使用 Amazon S3 托管静态网站](WebsiteHosting.md) 中所述）。您的用户加载了网站端点。

```
http://website.s3-website.us-east-1.amazonaws.com
```

现在，您想要使用此存储桶中存储的网页上的 JavaScript，以使用该存储桶的 Amazon S3 API 端点 `website.s3.us-east-1.amazonaws.com` 向同一存储桶发送经身份验证的 GET 和 PUT 请求。浏览器通常会阻止 JavaScript 允许这些请求，但借助 CORS，您可以配置您的存储桶以显式支持来自 `website.s3-website.us-east-1.amazonaws.com` 的跨源请求。

**方案 2**  
假设您想要托管来自您的 S3 存储桶的 Web 字体。浏览器会再次要求对正在加载的 Web 字体进行 CORS 检查 (也称为预检)。您可以配置托管 Web 字体的存储桶，以允许任何源发出这些请求。

## Amazon S3 如何评估针对存储桶的 CORS 配置？
<a name="cors-eval-criteria"></a>

Amazon S3 收到来自浏览器的预检请求后，它将为存储桶评估 CORS 配置，并使用第一个匹配传入浏览器请求的 `CORSRule` 规则来允许跨源请求。要使规则实现匹配，必须满足以下条件：
+ 向存储桶发出的 CORS 请求中的 `Origin` 标头必须与 CORS 配置的 `AllowedOrigins` 元素中的源相匹配。
+ 在向存储桶发出的 CORS 请求的 `Access-Control-Request-Method` 中指定的 HTTP 方法，必须与在 CORS 配置的 `AllowedMethods` 元素中列出的一个或多个方法相匹配。
+ 预检请求的 `Access-Control-Request-Headers` 标头中列出的标头必须与 CORS 配置的 `AllowedHeaders` 元素中的标头相匹配。

**注意**  
对存储桶启用 CORS 时，ACL 和策略将继续适用。

## 对象 Lambda 接入点如何支持 CORS
<a name="cors-olap-cors"></a>

当 S3 对象 Lambda 收到来自浏览器的请求或包含 `Origin` 标头的请求时，S3 对象 Lambda 始终会添加 `"AllowedOrigins":"*"` 标头字段。

有关使用 CORS 的更多信息，请参阅以下主题。

**Topics**
+ [跨源资源共享：使用案例场景](#example-scenarios-cors)
+ [Amazon S3 如何评估针对存储桶的 CORS 配置？](#cors-eval-criteria)
+ [对象 Lambda 接入点如何支持 CORS](#cors-olap-cors)
+ [CORS 配置的元素](ManageCorsUsing.md)
+ [配置跨源资源共享 (CORS)](enabling-cors-examples.md)
+ [测试 CORS](testing-cors.md)
+ [CORS 问题排查](cors-troubleshooting.md)

# CORS 配置的元素
<a name="ManageCorsUsing"></a>

要将您的存储桶配置为允许跨源请求，创建一个 CORS 配置。CORS 配置是一个包含元素的文档，这些元素标识可访问您的存储桶的源、对于每个源将支持的操作（HTTP 方法）以及其它操作特定的信息。您可以向配置添加最多 100 条规则。您可以将 CORS 配置作为 `cors` 子资源添加到存储桶中

如果要在 S3 控制台中配置 CORS，则必须使用 JSON 来创建 CORS 配置。新的 S3 控制台仅支持 JSON CORS 配置。

有关 CORS 配置及其中元素的更多信息，请参阅以下主题。有关如何添加 CORS 配置的说明，请参阅 [配置跨源资源共享 (CORS)](enabling-cors-examples.md)。

**重要**  
在 S3 控制台中，CORS 配置必须是 JSON。

**Topics**
+ [`AllowedMethods` 元素](#cors-allowed-methods)
+ [`AllowedOrigins` 元素](#cors-allowed-origin)
+ [`AllowedHeaders` 元素](#cors-allowed-headers)
+ [`ExposeHeaders` 元素](#cors-expose-headers)
+ [`MaxAgeSeconds` 元素](#cors-max-age)
+ [CORS 配置的示例](#cors-example-1)

## `AllowedMethods` 元素
<a name="cors-allowed-methods"></a>

在 CORS 配置中，您可以为 `AllowedMethods` 元素指定以下值。
+ GET
+ PUT
+ POST
+ DELETE
+ HEAD

## `AllowedOrigins` 元素
<a name="cors-allowed-origin"></a>

在 `AllowedOrigins` 元素中，可指定您希望允许从中发送跨源请求的源，例如 ` http://www.example.com`。源字符串只能包含至少一个 `*` 通配符，例如 `http://*.example.com`。您可以选择将 `*` 指定为源，以允许所有源发送跨源请求。您还可以指定 `https` 只允许安全的源。

## `AllowedHeaders` 元素
<a name="cors-allowed-headers"></a>

`AllowedHeaders` 元素通过 `Access-Control-Request-Headers` 标头指定预检请求中允许哪些标头。`Access-Control-Request-Headers` 标头中的每个标头名称必须匹配元素中的相应条目。Amazon S3 将仅发送请求的响应中允许的标头。有关适用于发送至 Amazon S3 的请求中的标头示例列表，请参阅 *Amazon Simple Storage Service API 参考*指南中的[常见请求标头](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTCommonRequestHeaders.html)。

配置中的每个 AllowedHeaders 字符串都可以包含至少一个 \$1 通配符。例如，`<AllowedHeader>x-amz-*</AllowedHeader>` 将允许所有特定于 Amazon 的标头。

## `ExposeHeaders` 元素
<a name="cors-expose-headers"></a>

每个 `ExposeHeader` 元素标识您希望客户能够从其应用程序 (例如，从 JavaScript `XMLHttpRequest` 对象) 进行访问的响应标头。有关常见的 Amazon S3 响应标头的列表，请参阅 *Amazon Simple Storage Service API 参考*指南中的[常见响应标头](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTCommonResponseHeaders.html)。

## `MaxAgeSeconds` 元素
<a name="cors-max-age"></a>

`MaxAgeSeconds` 元素指定在预检请求被资源、HTTP 方法和源识别之后，浏览器将为预检请求缓存响应的时间 (以秒为单位)。

## CORS 配置的示例
<a name="cors-example-1"></a>

您可以使用您自己的域（例如 `example1.com`）提供您的内容，而不是通过使用 Amazon S3 网站端点访问网站。有关如何使用您自己的域的信息，请参阅 [教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md)。

以下示例 CORS 配置具有三个规则，这些规则被指定为 `CORSRule` 元素：
+ 第一个规则允许来自 `http://www.example1.com` 源的跨源 PUT、POST 和 DELETE 请求。该规则还通过 `Access-Control-Request-Headers` 标头允许预检 OPTIONS 请求中的所有标头。作为对预检 OPTIONS 请求的响应，Amazon S3 将返回请求的标头。
+ 第二个规则允许与第一个规则具有相同的跨源请求，但第二个规则应用于另一个源 `http://www.example2.com`。
+ 第三个规则允许来自所有源的跨源 GET 请求。`*` 通配符将引用所有源。

------
#### [ JSON ]

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example1.com"
        ],
        "ExposeHeaders": []
    },
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example2.com"
        ],
        "ExposeHeaders": []
    },
    {
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
```

------
#### [ XML ]

```
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example1.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>http://www.example2.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>
```

------

CORS 配置还允许可选的配置参数，如下面的 CORS 配置所示。在本示例中，CORS 配置允许来自 `http://www.example.com` 源的跨源 PUT、POST 和 DELETE 请求。

------
#### [ JSON ]

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example.com"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2"
        ],
        "MaxAgeSeconds": 3000
    }
]
```

------
#### [ XML ]

```
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example.com</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
  <MaxAgeSeconds>3000</MaxAgeSeconds>
  <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
  <ExposeHeader>x-amz-request-id</ExposeHeader>
  <ExposeHeader>x-amz-id-2</ExposeHeader>
 </CORSRule>
</CORSConfiguration>
```

------

上述配置中的 `CORSRule` 元素包括以下可选元素：
+ `MaxAgeSeconds` — 指定在 Amazon S3 针对特定资源的预检 OPTIONS 请求作出响应后，浏览器缓存该响应的时间（以秒为单位，在本示例中为 3000 秒）。通过缓存响应，在需要重复原始请求时，浏览器无需向 Amazon S3 发送预检请求。
+ `ExposeHeaders` – 识别可让客户从应用程序 (例如，从 JavaScript `x-amz-server-side-encryption` 对象) 进行访问的响应标头 (在本示例中，为 `x-amz-request-id`、`x-amz-id-2` 和 `XMLHttpRequest`)。

# 配置跨源资源共享 (CORS)
<a name="enabling-cors-examples"></a>

跨源资源共享 (CORS) 定义了在一个域中加载的客户端 Web 应用程序与另一个域中的资源交互的方式。借助 CORS 支持，您可以使用 Amazon S3 构建各种富客户端 Web 应用程序，并选择性地允许跨源访问您的 Amazon S3 资源。

本节将向您介绍如何使用 Amazon S3 控制台、Amazon S3 REST API 和 Amazon SDK 来启用 CORS。要将您的存储桶配置为允许跨源请求，您可以将 CORS 配置添加到存储桶中。CORS 配置是一个定义规则的文档，这些规则标识可访问您的存储桶的源、每个源支持的操作（HTTP 方法）以及其他操作特定的信息。在 S3 控制台中，CORS 配置必须是 JSON 文档。

有关 JSON 和 XML 中的 CORS 配置示例，请参阅 [CORS 配置的元素](ManageCorsUsing.md)。

## 使用 S3 控制台
<a name="add-cors-configuration"></a>

本节说明如何使用 Amazon S3 控制台向 S3 存储桶添加跨源资源共享（CORS）配置。

在存储桶上启用 CORS 时，访问控制列表（ACL）和其他访问权限策略仍适用。

**重要**  
在 S3 控制台中，CORS 配置必须是 JSON。有关 JSON 和 XML 中的 CORS 配置示例，请参阅 [CORS 配置的元素](ManageCorsUsing.md)。

**将 CORS 配置添加到 S3 存储桶**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要为其创建存储桶策略的存储桶的名称。

1. 选择 **Permissions (权限)**。

1. 在 **Cross-origin resource sharing（CORS）（跨源资源共享（CORS））**部分中，请选择 **Edit（编辑）**。

1. 在 **CORS configuration editor (CORS 配置编辑器)** 文本框中，键入或复制并粘贴新的 CORS 配置，或者编辑现有配置。

   CORS 配置是一个 JSON 文件。您在编辑器中键入的文本必须是有效的 JSON。有关更多信息，请参阅 [CORS 配置的元素](ManageCorsUsing.md)。

1. 请选择**保存更改**。
**注意**  
Amazon S3 在 **CORS configuration editor（CORS 配置编辑器）**标题旁边显示存储桶的 Amazon Resource Name（ARN）。有关 ARN 的更多信息，请参阅《Amazon Web Services 一般参考》**中的 [Amazon 资源名称（ARN）和 Amazon 服务命名空间](https://docs.amazonaws.cn/general/latest/gr/aws-arns-and-namespaces.html)。

## 使用 Amazon 开发工具包
<a name="ManageCorsUsingSDK"></a>

您可以使用 Amazon SDK 管理存储桶的跨源资源共享（CORS）。有关 CORS 的更多信息，请参阅 [使用跨源资源共享 (CORS)](cors.md)。

 以下示例：
+ 创建 CORS 配置并对存储桶设置该配置
+ 通过添加规则来检索并修改配置
+ 向存储桶添加修改过的配置
+ 删除配置

------
#### [ Java ]

**Example**  

**Example**  
 有关如何创建和测试有效示例的说明，请参阅《适用于 Java 的 Amazon SDK 开发人员指南》中的[入门](https://docs.amazonaws.cn/sdk-for-java/v1/developer-guide/getting-started.html)。  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.BucketCrossOriginConfiguration;
import com.amazonaws.services.s3.model.CORSRule;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CORS {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        // Create two CORS rules.
        List<CORSRule.AllowedMethods> rule1AM = new ArrayList<CORSRule.AllowedMethods>();
        rule1AM.add(CORSRule.AllowedMethods.PUT);
        rule1AM.add(CORSRule.AllowedMethods.POST);
        rule1AM.add(CORSRule.AllowedMethods.DELETE);
        CORSRule rule1 = new CORSRule().withId("CORSRule1").withAllowedMethods(rule1AM)
                .withAllowedOrigins(Arrays.asList("http://*.example.com"));

        List<CORSRule.AllowedMethods> rule2AM = new ArrayList<CORSRule.AllowedMethods>();
        rule2AM.add(CORSRule.AllowedMethods.GET);
        CORSRule rule2 = new CORSRule().withId("CORSRule2").withAllowedMethods(rule2AM)
                .withAllowedOrigins(Arrays.asList("*")).withMaxAgeSeconds(3000)
                .withExposedHeaders(Arrays.asList("x-amz-server-side-encryption"));

        List<CORSRule> rules = new ArrayList<CORSRule>();
        rules.add(rule1);
        rules.add(rule2);

        // Add the rules to a new CORS configuration.
        BucketCrossOriginConfiguration configuration = new BucketCrossOriginConfiguration();
        configuration.setRules(rules);

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Add the configuration to the bucket.
            s3Client.setBucketCrossOriginConfiguration(bucketName, configuration);

            // Retrieve and display the configuration.
            configuration = s3Client.getBucketCrossOriginConfiguration(bucketName);
            printCORSConfiguration(configuration);

            // Add another new rule.
            List<CORSRule.AllowedMethods> rule3AM = new ArrayList<CORSRule.AllowedMethods>();
            rule3AM.add(CORSRule.AllowedMethods.HEAD);
            CORSRule rule3 = new CORSRule().withId("CORSRule3").withAllowedMethods(rule3AM)
                    .withAllowedOrigins(Arrays.asList("http://www.example.com"));

            rules = configuration.getRules();
            rules.add(rule3);
            configuration.setRules(rules);
            s3Client.setBucketCrossOriginConfiguration(bucketName, configuration);

            // Verify that the new rule was added by checking the number of rules in the
            // configuration.
            configuration = s3Client.getBucketCrossOriginConfiguration(bucketName);
            System.out.println("Expected # of rules = 3, found " + configuration.getRules().size());

            // Delete the configuration.
            s3Client.deleteBucketCrossOriginConfiguration(bucketName);
            System.out.println("Removed CORS configuration.");

            // Retrieve and display the configuration to verify that it was
            // successfully deleted.
            configuration = s3Client.getBucketCrossOriginConfiguration(bucketName);
            printCORSConfiguration(configuration);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    private static void printCORSConfiguration(BucketCrossOriginConfiguration configuration) {
        if (configuration == null) {
            System.out.println("Configuration is null.");
        } else {
            System.out.println("Configuration has " + configuration.getRules().size() + " rules\n");

            for (CORSRule rule : configuration.getRules()) {
                System.out.println("Rule ID: " + rule.getId());
                System.out.println("MaxAgeSeconds: " + rule.getMaxAgeSeconds());
                System.out.println("AllowedMethod: " + rule.getAllowedMethods());
                System.out.println("AllowedOrigins: " + rule.getAllowedOrigins());
                System.out.println("AllowedHeaders: " + rule.getAllowedHeaders());
                System.out.println("ExposeHeader: " + rule.getExposedHeaders());
                System.out.println();
            }
        }
    }
}
```

------
#### [ .NET ]

**Example**  
有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》**中的[适用于 .NET 的 Amazon SDK 入门](https://docs.amazonaws.cn/sdk-for-net/latest/developer-guide/net-dg-setup.html)。  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class CORSTest
    {
        private const string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; 
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            CORSConfigTestAsync().Wait();
        }
        private static async Task CORSConfigTestAsync()
        {
            try
            {
                // Create a new configuration request and add two rules    
                CORSConfiguration configuration = new CORSConfiguration
                {
                    Rules = new System.Collections.Generic.List<CORSRule>
                        {
                          new CORSRule
                          {
                            Id = "CORSRule1",
                            AllowedMethods = new List<string> {"PUT", "POST", "DELETE"},
                            AllowedOrigins = new List<string> {"http://*.example.com"}
                          },
                          new CORSRule
                          {
                            Id = "CORSRule2",
                            AllowedMethods = new List<string> {"GET"},
                            AllowedOrigins = new List<string> {"*"},
                            MaxAgeSeconds = 3000,
                            ExposeHeaders = new List<string> {"x-amz-server-side-encryption"}
                          }
                        }
                };

                // Add the configuration to the bucket. 
                await PutCORSConfigurationAsync(configuration);

                // Retrieve an existing configuration. 
                configuration = await RetrieveCORSConfigurationAsync();

                // Add a new rule.
                configuration.Rules.Add(new CORSRule
                {
                    Id = "CORSRule3",
                    AllowedMethods = new List<string> { "HEAD" },
                    AllowedOrigins = new List<string> { "http://www.example.com" }
                });

                // Add the configuration to the bucket. 
                await PutCORSConfigurationAsync(configuration);

                // Verify that there are now three rules.
                configuration = await RetrieveCORSConfigurationAsync();
                Console.WriteLine();
                Console.WriteLine("Expected # of rulest=3; found:{0}", configuration.Rules.Count);
                Console.WriteLine();
                Console.WriteLine("Pause before configuration delete. To continue, click Enter...");
                Console.ReadKey();

                // Delete the configuration.
                await DeleteCORSConfigurationAsync();

                // Retrieve a nonexistent configuration.
                configuration = await RetrieveCORSConfigurationAsync();
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }

        static async Task PutCORSConfigurationAsync(CORSConfiguration configuration)
        {

            PutCORSConfigurationRequest request = new PutCORSConfigurationRequest
            {
                BucketName = bucketName,
                Configuration = configuration
            };

            var response = await s3Client.PutCORSConfigurationAsync(request);
        }

        static async Task<CORSConfiguration> RetrieveCORSConfigurationAsync()
        {
            GetCORSConfigurationRequest request = new GetCORSConfigurationRequest
            {
                BucketName = bucketName

            };
            var response = await s3Client.GetCORSConfigurationAsync(request);
            var configuration = response.Configuration;
            PrintCORSRules(configuration);
            return configuration;
        }

        static async Task DeleteCORSConfigurationAsync()
        {
            DeleteCORSConfigurationRequest request = new DeleteCORSConfigurationRequest
            {
                BucketName = bucketName
            };
            await s3Client.DeleteCORSConfigurationAsync(request);
        }

        static void PrintCORSRules(CORSConfiguration configuration)
        {
            Console.WriteLine();

            if (configuration == null)
            {
                Console.WriteLine("\nConfiguration is null");
                return;
            }

            Console.WriteLine("Configuration has {0} rules:", configuration.Rules.Count);
            foreach (CORSRule rule in configuration.Rules)
            {
                Console.WriteLine("Rule ID: {0}", rule.Id);
                Console.WriteLine("MaxAgeSeconds: {0}", rule.MaxAgeSeconds);
                Console.WriteLine("AllowedMethod: {0}", string.Join(", ", rule.AllowedMethods.ToArray()));
                Console.WriteLine("AllowedOrigins: {0}", string.Join(", ", rule.AllowedOrigins.ToArray()));
                Console.WriteLine("AllowedHeaders: {0}", string.Join(", ", rule.AllowedHeaders.ToArray()));
                Console.WriteLine("ExposeHeader: {0}", string.Join(", ", rule.ExposeHeaders.ToArray()));
            }
        }
    }
}
```

------

## 使用 REST API
<a name="EnableCorsUsingREST"></a>

要对存储桶设置 CORS 配置，您可以使用 Amazon Web Services 管理控制台。如果您的应用程序需要它，您也可以直接发送 REST 请求。*Amazon Simple Storage Service API 参考*的下面几节描述了与 CORS 配置相关的 REST API 操作：
+ [PutBucketCors](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketPUTcors.html)
+ [GetBucketCors](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketGETcors.html)
+ [DeleteBucketCors](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketDELETEcors.html)
+ [OPTIONS object](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTOPTIONSobject.html)

# 测试 CORS
<a name="testing-cors"></a>

要测试 CORS 配置，可以使用 `OPTIONS` 方法发送 CORS 预检请求，以便服务器在可以接受发送该请求的情况下做出响应。Amazon S3 收到预检请求后，S3 会为存储桶评估 CORS 配置，并使用第一个与传入请求匹配的 `CORSRule` 规则来启用跨源请求。要使规则实现匹配，必须满足以下条件：
+ 向存储桶发出的 CORS 请求中的 `Origin` 标头必须与 CORS 配置的 `AllowedOrigins` 元素中的源相匹配。
+ 在向存储桶发出的 CORS 请求的 `Access-Control-Request-Method` 中指定的 HTTP 方法，必须与在 CORS 配置的 `AllowedMethods` 元素中列出的一个或多个方法相匹配。
+ 预检请求的 `Access-Control-Request-Headers` 标头中列出的标头必须与 CORS 配置的 `AllowedHeaders` 元素中的标头相匹配。

以下是 CORS 配置示例。要创建 CORS 配置，请参阅[配置 CORS](https://docs.amazonaws.cn/AmazonS3/latest/userguide/enabling-cors-examples.html)。有关 CORS 配置的更多示例，请参阅 [CORS 配置的元素](https://docs.amazonaws.cn/AmazonS3/latest/userguide/ManageCorsUsing.html)。

有关配置 CORS 规则和对 CORS 规则进行故障排除的指导，请参阅 Amazon Web Services re:Post 知识中心中的[如何在 Amazon S3 中配置 CORS，并通过 cURL 确认 CORS 规则？](https://repost.aws/knowledge-center/s3-configure-cors)

------
#### [ JSON ]

```
[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example1.com"
        ],
        "ExposeHeaders":  [
             "x-amz-meta-custom-header"
        ]
    
    }
]
```

------

要测试 CORS 配置，可以使用以下 CURL 命令发送预检 `OPTIONS` 检查。CURL 是一个命令行工具，可用于与 S3 进行交互。有关更多信息，请参阅 [CURL](https://curl.se/)。

```
 curl -v -X OPTIONS \
  -H "Origin: http://www.example1.com" \
  -H "Access-Control-Request-Method: PUT" \
  -H "Access-Control-Request-Headers: Authorization" \
  -H "Access-Control-Expose-Headers: x-amz-meta-custom-header"\
     "http://bucket_name.s3.amazonaws.com/object_prefix_name"
```

在上面的示例中，`curl -v -x OPTIONS` 命令用于向 S3 发送预检请求，来查询 S3 是否支持从跨源 `http://www.example1.com` 发送对于对象的 `PUT` 请求。标头 `Access-Control-Request-Headers` 和 `Access-Control-Expose-Headers` 是可选的。
+ 为响应预检 `OPTIONS` 请求中的 `Access-Control-Request-Method` 标头，如果请求的方法匹配，Amazon S3 会返回受支持方法的列表。
+ 为响应预检 `OPTIONS` 请求中的 `Access-Control-Request-Headers` 标头，如果请求的标头匹配，Amazon S3 会返回受支持标头的列表。
+ 为响应预检 `OPTIONS` 请求中的 `Access-Control-Expose-Headers` 标头，如果请求的标头与浏览器中运行的脚本可以访问的受支持标头匹配，Amazon S3 会返回受支持标头的列表。

**注意**  
发送预检请求时，如果不支持使用任何 CORS 请求标头，则不会返回任何响应 CORS 标头。

为响应此预检 `OPTIONS` 请求，您将收到 `200 OK` 响应。有关测试 CORS 时收到的常见错误代码以及解决 CORS 相关问题的更多信息，请参阅 [CORS 问题排查](https://docs.amazonaws.cn/AmazonS3/latest/userguide/cors-troubleshooting.html)。

```
< HTTP/1.1 200 OK
< Date: Fri, 12 Jul 2024 00:23:51 GMT
< Access-Control-Allow-Origin: http://www.example1.com
< Access-Control-Allow-Methods: GET, PUT, POST, DELETE 
< Access-Control-Allow-Headers: Authorization
< Access-Control-Expose-Headers: x-amz-meta-custom-header
< Access-Control-Allow-Credentials: true
< Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
< Server: AmazonS3
< Content-Length: 0
```

# CORS 问题排查
<a name="cors-troubleshooting"></a>

以下主题有助于排查与 S3 相关的一些常见 CORS 问题。

**Topics**
+ [403 禁止错误 - 未为此存储桶启用 CORS](#cors-not-enabled)
+ [403 禁止错误 - 不支持此 CORS 请求](#cors-not-enabled)
+ [在 CORS 响应中找不到标头](#Headers-not-found)
+ [有关 S3 代理集成的 CORS 的注意事项](#cors-in-proxy)

## 403 禁止错误：未为此存储桶启用 CORS
<a name="cors-not-enabled"></a>

当跨源请求发送到 Amazon S3 但未在 S3 存储桶上配置 CORS 时，会发生以下 `403 Forbidden` 错误。

 错误：HTTP/1.1 403 禁止 CORS 响应：未为此存储桶启用 CORS。

CORS 配置是一个包含规则的文档或策略，这些规则标识可访问您的存储桶的源、每个源将支持的操作（HTTP 方法）以及其它操作特定的信息。请参阅如何使用 Amazon S3 控制台、Amazon SDK 和 REST API 在 S3 上[配置 CORS](https://docs.amazonaws.cn/AmazonS3/latest/userguide/enabling-cors-examples.html)。有关 CORS 的更多信息以及 CORS 配置示例，请参阅 [CORS 的元素](https://docs.amazonaws.cn/AmazonS3/latest/userguide/ManageCorsUsing.html#cors-example-1)。

## 403 禁止错误：不支持此 CORS 请求
<a name="cors-not-enabled"></a>

当 CORS 配置中的 CORS 规则与请求中的数据不匹配时，会收到以下 `403 Forbidden` 错误。

错误：HTTP/1.1 403 禁止 CORS 响应：不支持此 CORS 请求。

因此，出现此 `403 Forbidden` 错误的原因可能有多种：
+ 不支持源。
+ 不支持方法。
+ 不支持请求的标头。

对于 Amazon S3 收到的每个请求，CORS 配置中必须具有与请求中的数据匹配的 CORS 规则。

### 不支持源
<a name="Origin-not-allowed"></a>

 向存储桶发出的 CORS 请求中的 `Origin` 标头必须与 CORS 配置的 `AllowedOrigins` 元素中的源相匹配。`AllowedOrigins` 元素中的通配符 (`"*"`) 将匹配所有 HTTP 方法。有关如何更新 `AllowedOrigins` 元素的更多信息，请参阅[配置跨源资源共享（CORS）](https://docs.amazonaws.cn/AmazonS3/latest/userguide/enabling-cors-examples.html)。

 例如，如果 `AllowedOrigins` 元素中仅包含 `http://www.example1.com` 域，则从 `http://www.example2.com` 域发送的 CORS 请求将收到 `403 Forbidden` 错误。

以下示例显示 CORS 配置的一部分，它在 `AllowedOrigins` 元素中包含 `http://www.example1.com` 域。

```
"AllowedOrigins":[
   "http://www.example1.com"
]
```

要使从 `http://www.example2.com` 域发送的 CORS 请求获得成功，应将 `http://www.example2.com` 域包含在 CORS 配置的 `AllowedOrigins` 元素中。

```
"AllowedOrigins":[
   "http://www.example1.com"
   "http://www.example2.com"
]
```

### 不支持方法
<a name="Methods-not-allowed"></a>

 在向存储桶发出的 CORS 请求的 `Access-Control-Request-Method` 中指定的 HTTP 方法，必须与在 CORS 配置的 `AllowedMethods` 元素中列出的一个或多个方法相匹配。`AllowedMethods` 中的通配符 (`"*"`) 将匹配所有 HTTP 方法。有关如何更新 `AllowedOrigins` 元素的更多信息，请参阅[配置跨源资源共享（CORS）](https://docs.amazonaws.cn/AmazonS3/latest/userguide/enabling-cors-examples.html)。

在 CORS 配置中，您可以在 `AllowedMethods` 元素中指定以下方法：
+ `GET`
+ `PUT`
+ `POST`
+ `DELETE`
+ `HEAD`

以下示例显示 CORS 配置的一部分，该配置在 `AllowedMethods` 元素中包含 `GET` 方法。只有包含 `GET` 方法的请求才会获得成功。

```
"AllowedMethods":[
   "GET"
]
```

 如果在 CORS 请求中使用了 HTTP 方法（例如 `PUT`），或者该方法包含在对存储桶的预检 CORS 请求中但不存在于 CORS 配置中，则该请求将导致 `403 Forbidden` 错误。要支持此 CORS 请求或 CORS 预检请求，必须将 `PUT` 方法添加到 CORS 配置中。

```
"AllowedMethods":[
   "GET"
   "PUT"
]
```

### 不支持请求的标头
<a name="Headers-not-allowed"></a>

 预检请求的 `Access-Control-Request-Headers` 标头中列出的标头必须与 CORS 配置的 `AllowedHeaders` 元素中的标头相匹配。有关可以在对 Amazon S3 的请求中使用的常见标头的列表，请参阅 [Common Request Headers](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTCommonRequestHeaders.html)。有关如何更新 `AllowedHeaders` 元素的更多信息，请参阅[配置跨源资源共享（CORS）](https://docs.amazonaws.cn/AmazonS3/latest/userguide/enabling-cors-examples.html)。

以下示例显示 CORS 配置的一部分，该配置在 `AllowedHeaders` 元素中包含 `Authorization` 标头。只有对 `Authorization` 标头的请求才会获得成功。

```
"AllowedHeaders":  [
    "Authorization"
]
```

 如果 CORS 请求中包含标头（例如 `Content-MD5`），但该标头不存在于 CORS 配置中，则该请求将导致 `403 Forbidden` 错误。要支持此 CORS 请求，必须将 `Content-MD5` 标头添加到 CORS 配置中。如果您要在 CORS 请求中同时将 `Authorization` 和 `Content-MD5` 标头传递到存储桶，请确认这两个标头都包含在 CORS 配置的 `AllowedHeaders` 元素中。

```
"AllowedHeaders":  [
    "Authorization"
    "Content-MD5"
]
```

## 在 CORS 响应中找不到标头
<a name="Headers-not-found"></a>

 CORS 配置中的 `ExposeHeaders` 元素确定了您希望在浏览器中运行的脚本和应用程序可以访问哪些响应标头，以便响应 CORS 请求。

如果存储在 S3 存储桶中的对象具有用户定义的元数据（例如 `x-amz-meta-custom-header`）以及响应数据，则此自定义标头可能包含您要从客户端 JavaScript 代码访问的其它元数据或信息。但出于安全考虑，默认情况下，浏览器会阻止访问自定义标头。要支持客户端 JavaScript 访问自定义标头，需要在 CORS 配置中包含该标头。

 在下面的示例中，`x-amz-meta-custom-header1` 标头包含在 `ExposeHeaders` 元素中。`x-amz-meta-custom-header2` 未包含在 `ExposeHeaders` 元素中，并且 CORS 配置中也缺少此标头。在响应中，仅返回 `ExposeHeaders` 元素中包含的值。如果请求在 `Access-Control-Expose-Headers` 标头中包含了 `x-amz-meta-custom-header2` 标头，则响应仍会返回 `200 OK`。但是，只有允许的标头（例如 `x-amz-meta-custom-header`）才会返回并显示在响应中。

```
"ExposeHeaders":  [
    "x-amz-meta-custom-header1"
]
```

 为确保所有标头都出现在响应中，请将所有允许的标头添加到 CORS 配置中的 `ExposeHeaders` 元素，如下所示。

```
"ExposeHeaders":  [
    "x-amz-meta-custom-header1",
    "x-amz-meta-custom-header2"
]
```

## 有关 S3 代理集成的 CORS 的注意事项
<a name="cors-in-proxy"></a>

如果您遇到错误且已经检查了 S3 存储桶上的 CORS 配置，并且跨源请求已发送到 Amazon CloudFront 等代理，请尝试以下操作：
+ 将设置配置为支持 HTTP 请求使用 `OPTIONS` 方法。
+ 将代理配置为转发以下标头：`Origin`、`Access-Control-Request-Headers` 和 `Access-Control-Request-Method`。
+ 将代理设置配置为在其缓存密钥中包含 origin 标头。这一点很重要，这是因为：如果缓存代理在其缓存密钥中不包含 origin 标头，则它们提供的缓存响应可能对于不同的源不包含适当的 CORS 标头。

一些代理为 CORS 请求提供预定义的功能。例如，在 CloudFront 中，您可以配置一个策略，该策略包括的标头 

 可在源为 Amazon S3 存储桶时启用跨源资源共享（CORS）请求。

 此策略包含以下设置：
+ 源请求中包含的标头：

   `Origin`

   `Access-Control-Request-Headers`

   `Access-Control-Request-Method`
+ 源请求中包含的 Cookie：无
+ 源请求中包含的查询字符串：无

有关更多信息，请参阅《CloudFront 开发人员指南》**中的[使用策略来控制源请求](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.htm)和[使用托管式源请求策略](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#managed-origin-request-policy-cors-s3)。

# 静态网站教程
<a name="static-website-tutorials"></a>

以下教程或演练提供了完整的过程，旨在介绍如何创建和配置 Amazon S3 通用存储桶来实施静态网站托管和托管点播视频流。此类教程的目的是提供一般指导。这些教程适用于实验室类型的环境，使用了示例存储桶名称、用户名等。在未进行仔细审核并进行改进以满足组织环境的独特需求的情况下，这些过程不适合在您的生产环境中直接使用。
+ [Hosting on-demand streaming video with Amazon S3, Amazon CloudFront, and Amazon Route 53](https://docs.amazonaws.cn/AmazonS3/latest/userguide/tutorial-s3-cloudfront-route53-video-streaming)：可以将 Amazon S3 与 Amazon CloudFront 结合使用，以安全和可扩展的方式托管视频，供点播观看。在将视频打包成正确的格式之后，可以将其存储在服务器或 S3 通用存储桶中，然后在查看者请求视频时使用 CloudFront 提供视频。在本教程中，您将了解如何配置通用存储桶来托管点播视频流，使用 CloudFront 进行传输，并使用 Amazon Route 53 进行域名系统（DNS）和自定义域管理。CloudFront 从其缓存中提供视频，只有在尚未缓存的情况下才从通用存储桶中检索视频。这种缓存管理特征可以通过低延迟、高吞吐量和高传输速度加快向全球观众传送视频的速度。有关 CloudFront 缓存管理的更多信息，请参阅 *Amazon CloudFront 开发人员指南*中的[优化缓存和可用性](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)。
+ [配置静态网站](https://docs.amazonaws.cn/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html)：可以配置一个通用存储桶，使其像网站一样运行。本教程将为您演练在 Amazon S3 上托管网站的步骤，包括创建存储桶、在 S3 控制台中启用静态网站托管、创建索引文档和创建错误文档。有关更多信息，请参阅[使用 Amazon S3 托管静态网站](https://docs.amazonaws.cn/AmazonS3/latest/userguide/WebsiteHosting.html)。
+ [使用注册到 Route 53 的自定义域配置静态网站](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html)：可以创建和配置一个通用存储桶来托管静态网站，并在 S3 上为网站（具有注册到 Amazon Route 53 的自定义域名）创建重定向。您使用 Route 53 来注册域，并定义要将域的互联网流量路由到何处。本教程介绍如何创建 Route 53 别名记录，来将域和子域的流量路由到包含 HTML 文件的通用存储桶。有关更多信息，请参阅《Amazon Route 53 开发人员指南》**中的 [Use your domain for a static website in an Amazon S3 bucket](https://docs.amazonaws.cn//Route53/latest/DeveloperGuide/getting-started-s3.html)。完成本教程后，可以选择使用 CloudFront 来提高网站的性能。有关更多信息，请参阅[使用 Amazon CloudFront 为网站提速](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-cloudfront-walkthrough.html)。
+ [Deploying a static website to Amazon Amplify Hosting from an S3 general purpose bucket](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-amplify)：我们建议您使用 [Amazon Amplify Hosting](https://docs.amazonaws.cn//amplify/latest/userguide/welcome.html.html) 来托管存储在 S3 上的静态网站内容。Amplify Hosting 是一项完全托管式服务，可让您轻松地在由 Amazon CloudFront 提供支持的全球可用内容分发网络（CDN）上部署您的网站，无需大量设置即可实现安全的静态网站托管。借助 Amazon Amplify Hosting，您可以选择对象在通用存储桶中的位置，将内容部署到托管式 CDN，并为网站生成一个公有 HTTPS URL 以供在任何地方访问。有关更多信息，请参阅《Amazon Amplify Hosting 用户指南》**中的 [Deploying a static website from S3 using the Amplify console](https://docs.amazonaws.cn//amplify/latest/userguide/deploy--from-amplify-console.html)。

# 教程：使用 Amazon S3、Amazon CloudFront 和 Amazon Route 53 托管点播流视频
<a name="tutorial-s3-cloudfront-route53-video-streaming"></a>

您可以将 Amazon S3 与 Amazon CloudFront 结合使用托管视频，实现以安全和可扩展的方式进行点播观看。点播视频 (VOD) 流代表您的视频内容存储在服务器上，观看者能够随时观看。

CloudFront 是一项快速、高度安全和可编程内容传送网络 (CDN) 服务。CloudFront 可以通过 HTTPS 从全球所有 CloudFront 节点安全地交付您的内容。有关 CloudFront 的更多信息，请参阅 *Amazon CloudFront 开发人员指南*中的[什么是 Amazon CloudFront？](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)。

CloudFront 缓存减少了源服务器必须直接响应的请求数量。观看者（最终用户）请求您使用 CloudFront 提供的视频时，请求将路由到离观看者所在位置更近的附近边缘站点。CloudFront 从其缓存中提供视频，只有在尚未缓存的情况下才从 S3 存储桶中检索视频。这种缓存管理特征可以通过低延迟、高吞吐量和高传输速度加快向全球观众传送视频的速度。有关 CloudFront 缓存管理的更多信息，请参阅 *Amazon CloudFront 开发人员指南*中的[优化缓存和可用性](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)。

**目标**  
在本教程中，您将配置 S3 存储桶以托管点播视频流，用 CloudFront 进行传输，并用 Amazon Route 53 进行域名系统（DNS）和自定义域管理。

**Topics**
+ [先决条件：用 Route 53 注册并配置自定义域](#cf-s3-prerequisites)
+ [步骤 1：创建 S3 存储桶](#cf-s3-step1)
+ [步骤 2：将视频上传到 S3 存储桶](#cf-s3-step2)
+ [步骤 3：创建 CloudFront 源访问身份](#cf-s3-step3)
+ [步骤 4：创建 CloudFront 分配](#cf-s3-step4)
+ [步骤 5：通过 CloudFront 分配访问视频](#cf-s3-step5)
+ [步骤 6：配置您的 CloudFront 分配以使用自定义域名](#cf-s3-step6)
+ [步骤 7：用自定义域名通过 CloudFront 分配访问 S3 视频](#cf-s3-step7)
+ [（可选）步骤 8：查看有关您的 CloudFront 分配接收的请求的数据](#cf-s3-step8)
+ [步骤 9：清除](#cf-s3-step9)
+ [后续步骤](#cf-s3-next-steps)

## 先决条件：用 Route 53 注册并配置自定义域
<a name="cf-s3-prerequisites"></a>

开始本教程之前，您必须用 Route 53 注册和配置自定义域（例如，**example.com**)，从而可将 CloudFront 分配配置为以后使用自定义域名。

如果没有自定义域名，并可通过 CloudFront 从类似于以下内容的 URL 中公开访问和托管您的 S3 视频：

```
https://CloudFront distribution domain name/Path to an S3 video
```

例如 **https://d111111abcdef8.cloudfront.net/sample.mp4**。

将您的 CloudFront 分配配置来使用配置了 Route 53 的自定义域名后，可以公开访问您的 S3 视频并通过 CloudFront 托管，URL 看起来类似于以下内容：

```
https://CloudFront distribution alternate domain name/Path to an S3 video
```

例如 **https://www.example.com/sample.mp4**。自定义域名对于观看者来说更简单、更直观。

****  
若要注册自定义域，请参阅 *Amazon Route 53 开发人员指南*中的[使用 Route 53 注册新域名](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-register.html)。

用 Route 53 注册域名时，Route 53 会为您创建稍后在本教程中使用的托管区域。此托管区域用于存储有关如何为域路由流量的信息，例如路由到 Amazon EC2 实例或 CloudFront 分配。

您的域名注册、您的托管区域和域名收到的 DNS 查询会产生相关费用。有关更多信息，请参阅 [Amazon Route 53 定价](https://www.amazonaws.cn/route53/pricing/)。

**注意**  
注册域名时，会立即产生费用，这是不可逆转的。您可以选择不自动续订域名，但要预先支付域名年费。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[注册新域](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-register.html)。

## 步骤 1：创建 S3 存储桶
<a name="cf-s3-step1"></a>

创建存储桶来存储计划流式传输的原始视频。

**创建存储桶**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在页面顶部的导航栏中，选择当前所显示 Amazon Web Services 区域的名称。接下来，选择要在其中创建存储桶的区域。
**注意**  
要最大程度地减少延迟和成本以及满足法规要求，请选择一个靠近您的区域。在某一区域存储的对象将一直留在该区域，除非您特意将其转移到其他区域。有关 Amazon S3 Amazon Web Services 区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Web Services 服务 端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择**创建存储桶**。此时将打开**创建存储桶**页面。

1. 对于**存储桶名称**，输入您的存储桶的名称（例如 **tutorial-bucket**）。

   有关 Amazon S3 存储桶命名的更多信息，请参阅 [通用存储桶命名规则](bucketnamingrules.md)。

1. 对于**区域**，选择要放置存储桶的 Amazon Web Services 区域。

   如果可能，您应选择最接近大多数观看者的区域位置。有关存储桶区域的更多信息，请参阅 [通用存储桶概述](UsingBucket.md)。

1. 对于**阻止此存储桶的公有访问设置**，保留默认设置（**阻止*全部*公有访问权限**已启用）。

   即使启用**阻止*全部*公有访问**，观看者仍然可以通过 CloudFront 访问上传的视频。此特征使用 CloudFront 托管存储在 S3 中视频的主要优势。

   除非需要为您的用例关闭一个或多个设置，我们建议您启用所有设置。有关阻止公有访问的更多信息，请参阅 [阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

1. 对于其余设置，保留默认值。

   （可选）如果要为您的特定用例配置其他存储桶设置，请参阅 [创建通用存储桶](create-bucket-overview.md)。

1. 选择**创建存储桶**。

## 步骤 2：将视频上传到 S3 存储桶
<a name="cf-s3-step2"></a>

以下过程介绍了如何使用控制台将视频文件上传到 S3 存储桶。如果将许多大型视频文件上传到 S3 时，您还可以使用 [Amazon S3 Transfer Acceleration](https://www.amazonaws.cn/s3/transfer-acceleration) 配置快速安全的文件传输。Transfer Acceleration 可以加快视频上传到 S3 存储桶的速度，以便远距离传输较大的视频。有关更多信息，请参阅 [使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输](transfer-acceleration.md)。

**将文件上传到存储桶**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在**通用存储桶**列表中，选择您在[步骤 1](#cf-s3-step1) 中创建的存储桶名称（例如 **tutorial-bucket**），以便将您的文件上传到其中。

1. 在存储桶的**对象** 选项卡上，选择**上传**。

1. 在**上传**页面的**文件和文件夹**下，选择**添加文件**。

1. 选择要上传的文件，然后选择**打开**。

   例如，您可以上传名为`sample.mp4`的视频文件。

1. 选择**上传**。

## 步骤 3：创建 CloudFront 源访问身份
<a name="cf-s3-step3"></a>

要限制从 S3 存储桶直接访问视频，请创建一个称为源访问身份（OAI）的特殊 CloudFront 用户。您会在本教程的后面部分中将 OAI 与您的分配关联。通过使用 OAI，您可以确保观看者无法绕过 CloudFront 并直接从 S3 存储桶获取视频。只有 CloudFront OAI 才能访问 S3 存储桶中的文件。有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[限制对 Amazon S3 源的访问](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)。



**重要**  
如果您用于托管静态网站的存储桶已使用具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS）进行加密，则必须使用来源访问控制（OAC）而不是来源访问身份（OAI）来保护来源。OAI 不支持 SSE-KMS，因此您必须改用 OAC。有关 OAC 的更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[限制对 Amazon S3 源的访问](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)。

**创建 CloudFront OAI**

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧导航窗格的**安全**部分，选择**来源访问**。

1. 在**身份**选项卡下，选择**创建来源访问身份**。

1. 输入名称（例如，**S3-OAI**) 作为新的源访问身份。

1. 选择**创建**。

## 步骤 4：创建 CloudFront 分配
<a name="cf-s3-step4"></a>

要使用 CloudFront 在您的 S3 存储桶中提供和分发视频，您必须创建 CloudFront 分配。

**Topics**
+ [创建 CloudFront 分配。](#cf-s3-step4-create-cloudfront)
+ [查看存储桶策略](#cf-s3-step4-review-bucket-policy)

### 创建 CloudFront 分配。
<a name="cf-s3-step4-create-cloudfront"></a>

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧导航窗格中，选择**分发**。

1. 选择**创建分发**。

1. 在**源**部分中，针对**源域**，选择以您在[步骤 1](#cf-s3-step1) 中创建的 S3 存储桶的名称开头的 S3 源域名（例如，**tutorial-bucket**)。

1. 对于**来源访问**，请选择**遗留访问身份**。

1. 在**源访问身份**下，选择您在[步骤 3](#cf-s3-step3) 中创建的现有源访问身份（例如，**S3-OAI**)。

1. 在**存储桶策略**下，选择**是，更新存储桶策略**。

1. 对于**默认缓存行为**部分，在**观看者协议策略**下，选择**重新定向 HTTP 至 HTTPS**。

   当您选择此特征时，HTTP 请求会自动重定向到 HTTPS，保护您的网站并保护观看者的数据。

1. 对于**默认缓存行为** 部分中的其他设置，请保留默认值。

   （可选）您还可以控制文件在 CloudFront 转发另一请求到您的源之前留在 CloudFront 缓存中的时长。减少持续时间让您可提供动态内容。增加持续时间意味着您的观看者将获得更好的性能，因为直接从边缘缓存提供文件的可能性更大。较长的持续时间还会减少源的负载。有关更多信息，请参阅 *Amazon CloudFront 开发人员指南*中的[管理内容在边缘缓存中保留的时长（过期时间）](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html)。

1. 对于其他部分，将其余设置保留设置为默认值。

   有关不同设置选项的更多信息，请参阅 *Amazon CloudFront 开发人员指南*中的[您创建或更新分发时指定的值](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html)。

1. 在页面底部，选择**创建分发**。

1. 在 CloudFront 分配的**常规**选项卡中，在**详细信息**下，分配的**上次修改**列的值从**部署中**更改为上次修改分配的时间戳。该过程通常需要花费几分钟的时间。

### 查看存储桶策略
<a name="cf-s3-step4-review-bucket-policy"></a>

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择您之前用作 CloudFront 分配源的存储桶名称（例如，**tutorial-bucket**)。

1. 选择**权限**选项卡。

1. 在**存储桶策略**部分中，确认您看到类似于存储桶策略文本中以下内容的语句：

   ```
   {
       "Version": "2008-10-17",		 	 	 
       "Id": "PolicyForCloudFrontPrivateContent",
       "Statement": [
           {
               "Sid": "1",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC"
               },
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::tutorial-bucket/*"
           }
       ]
   }
   ```

   这是您之前选择**是，更新存储桶策略**时 CloudFront 分配添加到存储桶策略的语句。

   此存储桶策略更新表示您已成功配置 CloudFront 分配以限制对 S3 存储桶的访问。由于存在此限制，只能通过 CloudFront 分配访问存储桶中的对象。

## 步骤 5：通过 CloudFront 分配访问视频
<a name="cf-s3-step5"></a>

现在，CloudFront 可以为存储在 S3 存储桶中的视频提供服务。要通过 CloudFront 访问您的视频，您必须将 CloudFront 分配域名与 S3 存储桶中视频路径组合在一起。

**用 CloudFront 分配域名创建 S3 视频的 URL**

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧导航窗格中，选择**分发**。

1. 要获取分发域名，请执行以下操作：

   1. 在**源**列中，通过查找其源名称来识别正确的 CloudFront 分配，该名称以[步骤 1](#cf-s3-step1) 中创建的 S3 存储桶开头（例如，**tutorial-bucket**)。

   1. 从列表中找到分布后，扩大**域名**列，复制域名值来获取您的 CloudFront 分配。

1. 在新浏览器选项卡中，粘贴您之前复制的分发域名。

1. 返回到上一个浏览器选项卡，然后通过以下网址打开 S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择您在[步骤 1](#cf-s3-step1) 中创建的存储桶名称（例如，**tutorial-bucket**)。

1. 在**对象**列表中，选择您在[步骤 2](#cf-s3-step2) 中上传的视频名称（例如，`sample.mp4`)。

1. 在对象详细信息页面上的**对象概述**部分中，复制**密钥**值。此值是指向 S3 存储桶中上传视频对象的路径。

1. 返回您之前粘贴分发域名的浏览器选项卡，在分发域名之后输入正斜杠 (**/**)，然后粘贴您之前复制的视频的路径（例如，`sample.mp4`)。

   现在，您的 S3 视频可以公开访问，并通过 CloudFront 托管在类似于以下的 URL 中：

   ```
   https://CloudFront distribution domain name/Path to the S3 video
   ```

   使用适当的值替换 *CloudFront 分配域名*和 *S3 视频的路径*。示例 URL 为 **https://d111111abcdef8.cloudfront.net/sample.mp4**

## 步骤 6：配置您的 CloudFront 分配以使用自定义域名
<a name="cf-s3-step6"></a>

要使用自己的域名而非 URL 中的 CloudFront 域名来访问 S3 视频，您必须在 CloudFront 分配中添加备用域名。

**Topics**
+ [请求 SSL 证书](#cf-s3-step6-create-SSL)
+ [将备用域名添加到您的 CloudFront 分配。](#cf-s3-step6-custom-domain)
+ [创建 DNS 记录，将备用域名的流量路由到您的 CloudFront 分配的域名](#cf-s3-step6-DNS-record)
+ [检查是否为您的分发启用了 IPv6，并根据需要创建另一个 DNS 记录](#s3-step6-ipv6)

### 请求 SSL 证书
<a name="cf-s3-step6-create-SSL"></a>

要允许观看者在视频流的 URL 中使用 HTTPS 和自定义域名，请使用 Amazon Certificate Manager (ACM) 以请求安全套接字层 (SSL) 证书。SSL 证书建立了指向网站的加密网络连接。

1. 登录到 Amazon Web Services 管理控制台 并通过 [https://console.aws.amazon.com/acm/](https://console.amazonaws.cn/acm/) 打开 ACM 控制台。

1. 如果显示介绍页面，请在**设置证书**中，选择**开始**。

1. 在**请求证书**页面上，选择**请求公有证书**，然后选择**请求证书**。

1. 在**添加域名**页面上，键入您要使用 SSL/TLS 证书保护的站点的完全限定域名 (FQDN)。使用星号 (`*`) 创建通配符证书保护同一域中的多个站点名称。具体来说，在本教程中，键入 **\$1** 和您在[先决条件](#cf-s3-prerequisites)中配置的自定义域名。例如，输入 **\$1.example.com**，然后选择**下一步**。

   有关更多信息，请参阅 *Amazon Certificate Manager 用户指南*中的[请求 ACM 公有证书（控制台）](https://docs.amazonaws.cn/acm/latest/userguide/gs-acm-request-public.html#request-public-console)。

1. 在**选择验证方法**页面上，选择 **DNS 验证**。然后选择**下一步**。

   如果您可以编辑 DNS 配置，建议使用 DNS 域验证而不是电子邮件验证。相对于电子邮件验证，DNS 验证有多种优势。有关更多信息，请参阅 *Amazon Certificate Manager 用户指南*中的[选项 1：DNS 验证](https://docs.amazonaws.cn/acm/latest/userguide/dns-validation.html)。

1. （可选）在**添加标签**页面上，您可以选择用元数据标记证书。

1. 选择**审核**。

1. 在**审核**页面上，验证**域名**和**验证方法**下的信息都正确无误。然后，选择**确认和请求**。

   **验证**页面显示正在处理您的请求，并且正在验证证书域。等待验证的证书处于**等待验证**状态。

1. 在**验证**页面上，选择自定义域名左侧的向下箭头，然后选择**在 Route 53 中创建记录**以通过 DNS 验证您的域所有权。

   这将添加由 Amazon Certificate Manager 提供的 CNAME 记录到您的 DNS 配置。

1. 在**在 Route 53 中创建记录**对话框中，选择**创建**。

   **验证**页面应在底部显示**成功**状态通知。

1. 选择**继续**查看**证书**列表页。

   新证书的**状态**将在 30 分钟内从**等待验证**更改为**已颁发**。

### 将备用域名添加到您的 CloudFront 分配。
<a name="cf-s3-step6-custom-domain"></a>

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧导航窗格中，选择**分发**。

1. 为您在[步骤 4](#cf-s3-step3) 中创建的分发选择 ID。

1. 在**常规**选项卡，转到**设置**部分，然后选择**编辑**。

1. 在**编辑设置**页面上，对于**备用域名（CNAME）- *可选***，选择**添加项目**，以添加要在此 CloudFront 分配提供的 S3 视频 URL 中使用的自定义域名。

   例如，在本教程中，如果您要路由子域，如 `www.example.com`，请输入带域名 (`example.com`) 的子域名 (`www`)。具体来说，输入 **www.example.com**。
**注意**  
您添加的备用域名（CNAME）必须包含您之前附加到 CloudFront 分配的 SSL 证书。

1. 对于**自定义 SSL 证书 - *可选***，选择您在之前请求的 SSL 证书（例如，**\$1.example.com**)。
**注意**  
如果在请求后没有立即看到 SSL 证书，则可以等待 30 分钟，然后刷新列表，直到 SSL 证书可供您选择。

1. 对于其余设置，保留默认值。选择**保存更改**。

1. 在分发的**常规**选项卡中，请等待**上次修改**的值从**部署中**更改为上次修改分发的时间戳。

### 创建 DNS 记录，将备用域名的流量路由到您的 CloudFront 分配的域名
<a name="cf-s3-step6-DNS-record"></a>

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

1. 在左侧导航窗格中，选择**托管区域**。

1. 在**托管区域**页面上，选择 Route 53 在[先决条件](#cf-s3-prerequisites)中为您创建的托管区域名称（例如，**example.com**)。

1. 选择**创建记录**，然后使用**快速创建记录**方法。

1. 对于**记录名称**，请保持记录名称的值与您在之前添加的 CloudFront 分配的备用域名相同。

   在本教程中，要将流量路由到子域，如 `www.example.com`，请输入不带域名的子域名。例如，在您的自定义域名之前仅输入 **www** 文本字段。

1. 在**记录类型**中，选择 **A – 将流量路由到 IPv4 地址和某些 Amazon 资源**。

1. 对于**值**，选择**别名**切换以启用别名资源。

1. 在**将流量路由至**下，从下拉列表中选择**别名到 CloudFront 分配**。

1. 在**选择分发**搜索框中，选择您在[步骤 4](#cf-s3-step4) 中创建的 CloudFront 分配的域名。

   要查找您的 CloudFront 分配域名，请执行以下操作：

   1. 在新浏览器选项卡中，登录到 Amazon Web Services 管理控制台 并通过 [https://console.amazonaws.cn/cloudfront/v3/home](https://console.amazonaws.cn/cloudfront/v3/home) 打开 CloudFront 控制台。

   1. 在左侧导航窗格中，选择**分发**。

   1. 在**源**列中，通过查找其源名称来识别正确的 CloudFront 分配，该名称以[步骤 1](#cf-s3-step1) 中创建的 S3 存储桶开头（例如，**tutorial-bucket**)。

   1. 从列表中找到分发后，扩大**域名**列，查找域名来获取您的 CloudFront 分配。

1. 在 Route 53 控制台中的**创建记录**页面上，对于其余设置，请保留默认值。

1. 选择**创建记录**。

### 检查是否为您的分发启用了 IPv6，并根据需要创建另一个 DNS 记录
<a name="s3-step6-ipv6"></a>

如果为您的分发启用了 IPv6，则必须创建另一个 DNS 记录。

1. 要检查是否为分发启用了 IPv6，请执行以下操作：

   1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

   1. 在左侧导航窗格中，选择**分发**。

   1. 选择您在[步骤 4](#cf-s3-step4) 中创建的 CloudFront 分配的 ID。

   1. 在**常规**选项卡上，在**设置**下，请检查是否**启用** **IPv6**。

      如果为您的分发启用了 IPv6，则必须创建另一个 DNS 记录。

1. 如果为分发启用了 IPv6，请执行以下操作来创建 DNS 记录：

   1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

   1. 在左侧导航窗格中，选择**托管区域**。

   1. 在**托管区域**页面上，选择 Route 53 在[先决条件](#cf-s3-prerequisites)中为您创建的托管区域名称（例如，**example.com**)。

   1. 选择**创建记录**，然后使用**快速创建记录**方法。

   1. 对于**记录名称**，在自定义域名之前的文本字段中，输入您在之前创建 IPv4 DNS 记录时键入的相同值。例如，在本教程中，要将流量路由到子域 `www.example.com`，请仅输入 **www**。

   1. 对于**记录类型**，选择 **AAAA-将流量路由到 IPv6 地址和 Amazon 一些资源**。

   1. 对于**值**，选择**别名**切换以启用别名资源。

   1. 在**将流量路由至**下，从下拉列表中选择**别名到 CloudFront 分配**。

   1. 在**选择分发**搜索框中，选择您在[步骤 4](#cf-s3-step4) 中创建的 CloudFront 分配的域名。

   1. 对于其余设置，保留默认值。

   1. 选择**创建记录**。

## 步骤 7：用自定义域名通过 CloudFront 分配访问 S3 视频
<a name="cf-s3-step7"></a>

要用自定义 URL 访问 S3 视频，您必须将备用域名与 S3 存储桶中视频路径结合起来。

**创建自定义 URL 通过 CloudFront 分配访问 S3 视频**

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧导航窗格中，选择**分发**。

1. 要获取您的 CloudFront 分配的备用域名，请执行以下操作：

   1. 在**源**列中，通过在[步骤 1](#cf-s3-step1) 中创建的 S3 存储桶名称查找源名称来识别正确的 CloudFront 分配（例如，**tutorial-bucket**)。

   1. 从列表中找到分发后，扩大**备用域名**列，复制 CloudFront 分配的备用域名值。

1. 在新的浏览器选项卡中，粘贴 CloudFront 分配的备用域名。

1. 返回到上一个浏览器选项卡，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 查找[步骤 5](#cf-s3-step5) 中解释的 S3 视频的路径。

1. 返回到之前粘贴备用域名的浏览器选项卡，键入正斜杠 (**/**)，然后粘贴 S3 视频的路径（例如，`sample.mp4`)。

   现在，您的 S3 视频可以公开访问，并可通过 CloudFront 从类似于以下的自定义 URL 中托管：

   ```
   https://CloudFront distribution alternate domain name/Path to the S3 video
   ```

   使用适当的值替换 *CloudFront 分配备用域名*和 *S3 视频的路径*。示例 URL 为 **https://www.example.com/sample.mp4**。

## （可选）步骤 8：查看有关您的 CloudFront 分配接收的请求的数据
<a name="cf-s3-step8"></a>

**查看有关您的 CloudFront 分配接收的请求数据**

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧窗格中，在**报告和分析**中，从控制台中选择报告，范围从**缓存统计数据**、**常见对象**、**顶级推荐人**、**使用**和**观看者**。

   您可以筛选每个报告仪表板。有关更多信息，请参阅 [Amazon CloudFront 开发人员指南](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/reports.html)中的*控制台中的 CloudFront 报告*。

1. 要筛选数据，请选择您在[步骤 4](#cf-s3-step4) 中创建的 CloudFront 分配的 ID。

## 步骤 9：清除
<a name="cf-s3-step9"></a>

如果您仅使用 CloudFront 和 Route 53 托管 S3 串流视频作为学习练习，请删除您分派的 Amazon 资源，使其不再产生费用。

**注意**  
注册域名时，会立即产生费用，这是不可逆转的。您可以选择不自动续订域名，但要预先支付域名年费。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[注册新域](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-register.html)。

**Topics**
+ [删除 CloudFront 分配](#cf-s3-step9-delete-cf)
+ [删除 DNS 记录](#cf-s3-step9-delete-dns)
+ [删除您的自定义域公有托管区域](#cf-s3-step9-delete-hosted-zone)
+ [从 Route 53 中删除自定义域名](#cf-s3-step9-delete-domain)
+ [删除 S3 源存储桶中的原始视频](#cf-s3-step9-delete-video)
+ [删除 S3 源存储桶](#cf-s3-step9-delete-bucket)

### 删除 CloudFront 分配
<a name="cf-s3-step9-delete-cf"></a>

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

1. 在左侧导航窗格中，选择**分发**。

1. 在**源**列中，通过在[步骤 1](#cf-s3-step1) 中创建的 S3 存储桶名称查找以其开头的源名称，识别正确的 CloudFront 分配（例如，**tutorial-bucket**)。

1. 要删除 CloudFront 分配，必须先将其禁用。
   + 如果**状态**列的值为**已启用**，**上次修改**的值是上次修改分发的时间戳，请继续禁用分发，然后再删除它。
   + 如果**状态**的值为**已启用**，并且**上次修改**的值为**部署中**，请等待**状态**的值更改为上次修改分配的时间戳。然后继续禁用分发，再删除它。

1. 要禁用 CloudFront 分配，请执行以下操作：

   1. 在**分发**列表中，选中要删除分发的 ID 旁边的复选框。

   1. 要禁用分发，选择**禁用**，然后选择**禁用**确认。

      如果禁用的分发包含一个相关的备用域名，则 CloudFront 会停止接受该域名（例如，`www.example.com`）的流量，即便另一个分发有一个包含通配符 (`*`) 且匹配同样域的备用域名（例如，`*.example.com`）。

   1. **状态**的值立即变为**禁用**。等到**上次修改**的值从**部署中**变为上次修改分发的时间戳。

      由于 CloudFront 必须将此更改传播到所有边缘站点，所以可能需要几分钟时间才能完成更新，并且**删除**选项可供您删除分发。

1. 要删除禁用的分发，请执行以下操作：

   1. 选中要删除分发的 ID 旁边的复选框。

   1. 选择**删除**，然后选择**删除**以确认。

### 删除 DNS 记录
<a name="cf-s3-step9-delete-dns"></a>

如果要删除域的公有托管区域（包括 DNS 记录），请参阅 *Amazon Route 53 开发人员指南*中的 [删除您的自定义域公有托管区域](#cf-s3-step9-delete-hosted-zone)。如果您只想删除在[步骤 6](#cf-s3-step6) 中创建的 DNS 记录，执行以下操作：

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

1. 在左侧导航窗格中，选择**托管区域**。

1. 在**托管区域**页面上，选择 Route 53 在[先决条件](#cf-s3-prerequisites)中为您创建的托管区域名称（例如，**example.com**)。

1. 在记录列表中，选择要删除的记录旁边的复选框（在[步骤 6](#cf-s3-step6) 中创建的记录)。
**注意**  
您不能删除**类型**值为 **NS**或 **SOA** 的记录。

1. 选择**删除记录**。

1. 要确认删除，请选择**删除**。

   对记录的更改需要一定时间才会传播到 Route 53 DNS 服务器。目前，验证更改是否已传播的唯一方式是使用 [GetChange API 操作](https://docs.amazonaws.cn/Route53/latest/APIReference/API_GetChange.html)。更改通常在 60 秒内传播到所有 Route 53 服务器。

### 删除您的自定义域公有托管区域
<a name="cf-s3-step9-delete-hosted-zone"></a>

**警告**  
如果您希望保留域注册，但停止将互联网流量路由到您的网站或 Web 应用程序，建议您删除托管区域（如前一节所述）中的记录，而不是删除托管区域。  
如果删除托管区域，其他人可以劫持域并使用您的域名将流量路由到他们自己的资源。  
此外，如果您删除托管区域，则无法取消删除它。您必须创建新的托管区域并更新域注册的名称服务器，这最多需要 48 个小时生效。  
如果您想要使域在互联网上不可用，可以将 DNS 服务转移到免费的 DNS 服务，然后删除 Route 53 托管区域。这可防止以后的 DNS 查询可能被错误路由。  
如果已经用 Route 53 注册域，请参阅 *Amazon Route 53 开发人员指南*中的[为域添加或更改名称服务器和粘附记录](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-name-servers-glue-records.html)，了解有关将 Route 53 名称服务器替换为新 DNS 服务的名称服务器的信息。
如果此域已向其他注册商注册，请使用注册商提供的方法更改此域的名称服务器。
如果要删除子域 (`www.example.com`) 的托管区域，则不需要更改域 (`example.com`) 的名称服务器。

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

1. 在左侧导航窗格中，选择**托管区域**。

1. 在**托管区域**页面上，选择您要删除的托管区域所对应的行。

1. 在托管区域的**记录**选项卡上，请确认您要删除的托管区域仅包含 **NS** 和 **SOA** 记录。

   如果它包含其他记录，请先将其删除。

   如果您为子域的托管区域创建了任何 NS 记录，请也删除此类记录。

1. 在托管区的 **DNSSEC 签署**选项卡上，禁用 DNSSEC 签名（如果启用）。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[禁用 DNSSEC 签名](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/dns-configuring-dnssec-disable.html)。

1. 在托管区域的详细信息页面顶部，选择**删除区域**。

1. 若要确认删除，请输入 **delete**，然后选择**删除**。

### 从 Route 53 中删除自定义域名
<a name="cf-s3-step9-delete-domain"></a>

对于大多数顶级域 (TLD)，可在不需要域时删除域注册。如果在注册的计划到期时间之前从 Route 53 删除域名注册，Amazon 将不退还注册费。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[删除域名注册](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-delete.html)。

**重要**  
如果您想在 Amazon Web Services 账户 之间转移域或将域转移到另一个注册商，请不要删除域并期望立即重新注册。相反，请参阅 *Amazon Route 53 开发人员指南*中的适用文档：  
[将域转移到其他 Amazon Web Services 账户](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-transfer-between-aws-accounts.html)
[将域从 Amazon Route 53 转移到另一注册商](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-transfer-from-route-53.html)

### 删除 S3 源存储桶中的原始视频
<a name="cf-s3-step9-delete-video"></a>

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择您在[步骤 2](#cf-s3-step2) 中将视频上传到其中的存储桶名称（例如，**tutorial-bucket**)。

1. 在**对象**选项卡上，选中要删除的对象名称左侧的复选框（例如，`sample.mp4`）。

1. 选择**删除**。

1. 在**永久删除对象？**下方，输入 **permanently delete** 以确认您要删除此对象。

1. 选择**删除对象**。

### 删除 S3 源存储桶
<a name="cf-s3-step9-delete-bucket"></a>

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择您在[步骤 1](#cf-s3-step1) 中创建的存储桶名称旁边的选项按钮（例如，**tutorial-bucket**)。

1. 选择**删除**。

1. 在**删除存储桶**页面上，通过在文本字段中输入存储桶名称来确认要删除存储桶，然后选择**删除存储桶**。

## 后续步骤
<a name="cf-s3-next-steps"></a>

完成本教程后，您可以进一步探索以下相关使用案例：
+ 将 S3 视频转换为特定电视或连接设备所需的流媒体格式，然后再使用 CloudFront 分配托管这些视频。

  要使用 Amazon S3 批量操作、Amazon Lambda 和 AWS Elemental MediaConvert 将视频集批量转码为各种输出媒体格式，请参阅[教程：使用 S3 批量操作对视频进行批量转码](tutorial-s3-batchops-lambda-mediaconvert-video.md)。
+ 使用 CloudFront 和 Route 53 托管存储在 S3 中的其他对象，如图像、音频、动态图形、样式表、HTML、JavaScript、反应应用等。

  有关示例，请参阅 [教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md) 和 [使用 Amazon CloudFront 为网站提速](website-hosting-cloudfront-walkthrough.md)。
+ 使用 [Amazon S3 Transfer Acceleration](https://www.amazonaws.cn/s3/transfer-acceleration) 配置快速安全的文件传输。Transfer Acceleration 可以加快视频上传到 S3 存储桶的速度，以便远距离传输较大的视频。Transfer Acceleration 通过 CloudFront 全球分布的边缘站点和 Amazon 骨干网络路由流量，提高传输性能。它还利用网络协议优化。有关更多信息，请参阅 [使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输](transfer-acceleration.md)。

# 教程：在 Amazon S3 上配置静态网站
<a name="HostingWebsiteOnS3Setup"></a>

**重要**  
Amazon S3 现在将具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）作为 Amazon S3 中每个存储桶的基本加密级别。从 2023 年 1 月 5 日起，上传到 Amazon S3 的所有新对象都将自动加密，不会产生额外费用，也不会影响性能。S3 存储桶默认加密配置和上传的新对象的自动加密状态可在 CloudTrail 日志、S3 清单、S3 Storage Lens 存储统计管理工具和 Amazon S3 控制台中查看，并可用作 Amazon CLI 和 Amazon SDK 中的附加 Amazon S3 API 响应标头。有关更多信息，请参阅[默认加密常见问题解答](https://docs.amazonaws.cn/AmazonS3/latest/userguide/default-encryption-faq.html)。

您可以配置 Amazon S3 存储桶，使其功能与网站相似。本示例向您演练了在 Amazon S3 上托管网站的步骤。

**重要**  
以下教程需要禁用“屏蔽公共访问权限”。我们建议将“屏蔽公共访问权限”保持为启用状态。如果要将所有四个“屏蔽公共访问权限”设置保持为启用状态并托管静态网站，则可以使用 Amazon CloudFront 来源访问控制（OAC）。Amazon CloudFront 提供了设置安全静态网站所需的功能。Amazon S3 静态网站仅支持 HTTP 端点。Amazon CloudFront 使用 Amazon S3 的持久存储，同时提供额外的安全标头，如 HTTPS。HTTPS 通过加密正常 HTTP 请求并防范常见的网络攻击来增强安全性。有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[安全静态网站入门](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。

**Topics**
+ [步骤 1：创建存储桶](#step1-create-bucket-config-as-website)
+ [步骤 2：启用静态网站托管](#step2-create-bucket-config-as-website)
+ [步骤 3：编辑屏蔽公共访问权限设置](#step3-edit-block-public-access)
+ [步骤 4：添加可使您的存储桶内容公开可用的存储桶策略](#step4-add-bucket-policy-make-content-public)
+ [步骤 5：配置索引文档](#step5-upload-index-doc)
+ [步骤 6：配置错误文档](#step6-upload-error-doc)
+ [步骤 7：测试您的网站端点](#step7-test-web-site)
+ [步骤 8：清除](#getting-started-cleanup-s3-website-overview)

## 步骤 1：创建存储桶
<a name="step1-create-bucket-config-as-website"></a>

以下说明概述了如何创建存储桶以用于网站托管。有关创建存储桶的详细分步说明，请参阅[创建通用存储桶](create-bucket-overview.md)。

**创建存储桶**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择 **Create bucket（创建存储桶）**。

1. 输入 **Bucket name（存储桶名称）**（例如 **example.com**）。

1. 请选择要在其中创建存储桶的区域。

   请选择一个在地理上靠近您的区域可最大程度地减少延迟和成本，或满足法规要求。您选择的区域决定了您的 Amazon S3 网站端点。有关更多信息，请参阅 [网站端点](WebsiteEndpoints.md)。

1. 要接受默认设置并创建存储桶，请选择 **Create（创建）**。

## 步骤 2：启用静态网站托管
<a name="step2-create-bucket-config-as-website"></a>

创建存储桶后，您可以为存储桶启用静态网站托管。您可以创建新存储桶或使用现有存储桶。

**启用静态网站托管**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要为其启用静态网站托管的存储桶的名称。

1. 选择**属性**。

1. 在**静态网站托管**下，请选择**编辑**。

1. 请选择**使用此存储桶托管网站**。

1. 在**静态网站托管**下，请选择**启用**。

1. 在 **Index document (索引文档)** 中，输入索引文档的文件名，通常为 `index.html`。

   索引文档名称区分大小写，并且必须与您计划上传到 S3 存储桶的 HTML 索引文档的文件名完全匹配。当您为网站托管配置存储桶时，您必须指定索引文档。当对根域或任何子文件夹发出请求时，Amazon S3 将返回此索引文档。有关更多信息，请参阅 [配置索引文档](IndexDocumentSupport.md)。

1. 要为 4XX 类错误提供您自己的自定义错误文档，请在**错误文档**中输入自定义错误文档文件名。

   错误文档名称区分大小写，并且必须与您计划上传到 S3 存储桶的 HTML 错误文档的文件名完全匹配。如果未指定自定义错误文档并发生错误，Amazon S3 返回默认 HTML 错误文档。有关更多信息，请参阅 [配置自定义错误文档](CustomErrorDocSupport.md)。

1. （可选）如果要指定高级重定向规则，请在 **Redirection rules**（重定向规则）中，输入 JSON 来描述规则。

   例如，您可以根据请求中的特定对象键名或前缀按条件路由请求。有关更多信息，请参阅 [配置重新导向规则以使用高级条件重新导向](how-to-page-redirect.md#advanced-conditional-redirects)。

1. 选择 **Save changes（保存更改）**。

   Amazon S3 为您的存储桶启用静态网站托管。在页面底部的**静态网站托管**下，您可以看到存储桶的网站端点。

1. 在**静态网站托管**下，记下**端点**。

   **端点**是存储桶的 Amazon S3 网站端点。将存储桶配置为静态网站后，您可以使用此端点来测试您的网站。

## 步骤 3：编辑屏蔽公共访问权限设置
<a name="step3-edit-block-public-access"></a>

默认情况下，Amazon S3 阻止对您的账户和存储桶的公有访问权限。如果要使用存储桶托管静态网站，您可以使用以下步骤编辑您的屏蔽公共访问权限设置。

**警告**  
在完成这些步骤之前，请查看[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)，来确保您了解并接受支持公共访问权限所涉及的风险。当您关闭屏蔽公共访问权限设置以使您的存储桶变为公有时，Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 请选择已配置为静态网站的存储桶的名称。

1. 选择**权限**。

1. 在**屏蔽公共访问权限（存储桶设置）**下，请选择**编辑**。

1. 清除**阻止*所有*公有访问**，然后选择**保存更改**。  
![\[Amazon S3 控制台，显示屏蔽公共访问权限存储桶设置。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/edit-public-access-clear.png)

   Amazon S3 关闭了存储桶的屏蔽公共访问权限设置。要创建公有静态网站，可能还必须[为您的账户配置屏蔽公共访问权限设置](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/block-public-access-account.html)，然后再添加存储桶策略。如果当前已开启账户的屏蔽公共访问权限设置，您将在**屏蔽公共访问权限（存储桶设置）**下看到一条备注。

## 步骤 4：添加可使您的存储桶内容公开可用的存储桶策略
<a name="step4-add-bucket-policy-make-content-public"></a>

在编辑 S3 屏蔽公共访问权限设置后，您可以添加存储桶策略以授予对存储桶的公有读取访问权限。当您授予公有读取访问权限时，Internet 上的任何人都可以访问您的存储桶。

**重要**  
下面的策略仅供举例说明，仍允许完全访问您存储桶的内容。在继续执行此步骤之前，请查看[如何保护 Amazon S3 存储桶中的文件？](https://www.amazonaws.cn/premiumsupport/knowledge-center/secure-s3-resources/)，以确保您了解保护 S3 存储桶中文件的最佳实践以及授予公有访问权限所涉及的风险。

1. 在**存储桶** 下，请选择存储桶的名称。

1. 选择**权限**。

1. 在**存储桶策略**下，请选择**编辑**。

1. 要授予对网站的公有读取访问权限，请复制以下存储桶策略，将其粘贴到**存储桶策略编辑器**中。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PublicReadGetObject",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::Bucket-Name/*"
               ]
           }
       ]
   }
   ```

1. 将 `Resource` 更新为您的存储桶名称。

   在上述示例存储桶策略中，*Bucket-Name* 是存储桶名称的占位符。要将此存储桶策略用于您自己的存储桶，您必须更新此名称以匹配您的存储桶名称。

1. 选择**保存更改**。

   此时将显示一条消息，指示存储桶策略已成功添加。

   如果您看到显示 `Policy has invalid resource` 的错误，请确认存储桶策略中的存储桶名称与您的存储桶名称匹配。有关添加存储桶策略的信息，请参阅[如何添加 S3 存储桶策略？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/add-bucket-policy.html)

   如果您收到错误消息且无法保存存储桶策略，请检查您的账户和存储桶的屏蔽公共访问权限设置以确认您允许对存储桶进行公有访问。

## 步骤 5：配置索引文档
<a name="step5-upload-index-doc"></a>

当您为存储桶启用静态网站托管时，您可以输入索引文档的名称（例如，**index.html**）。为存储桶启用静态网站托管后，您可以将具有此索引文档名称的 HTML 文件上传到存储桶。

**配置索引文档**

1. 创建 `index.html` 文件。

   如果您没有 `index.html` 文件，则可以使用以下 HTML 创建一个：

   ```
   <html xmlns="http://www.w3.org/1999/xhtml" >
   <head>
       <title>My Website Home Page</title>
   </head>
   <body>
     <h1>Welcome to my website</h1>
     <p>Now hosted on Amazon S3!</p>
   </body>
   </html>
   ```

1. 将索引文件保存在本地。

   索引文档文件名必须与您在**静态网站托管**对话框中输入的索引文档名称完全匹配。索引文档名称区分大小写。例如，如果在**静态网站托管**对话框中为**索引文档**名称输入 `index.html`，则索引文档文件名也必须是 `index.html`，而不是 `Index.html`。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要用于托管静态网站的存储桶的名称。

1. 为您的存储桶启用静态网站托管，并输入索引文档的确切名称（例如 `index.html`）。有关更多信息，请参阅 [启用网站托管](EnableWebsiteHosting.md)。

   启用静态网站托管后，继续执行步骤 6。

1. 要将索引文档上传到存储桶，请执行以下操作之一：
   + 将索引文件拖放到控制台存储桶列表中。
   + 选择**上传**，然后按照提示选择并上传索引文件。

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

1. （可选）将其他网站内容上传到您的存储桶。

## 步骤 6：配置错误文档
<a name="step6-upload-error-doc"></a>

当您为存储桶启用静态网站托管时，请输入错误文档的名称（例如，**404.html**）。为存储桶启用静态网站托管后，您可以将具有此错误文档名称的 HTML 文件上传到存储桶。

**要配置错误文档**

1. 创建错误文档，例如 `404.html`。

1. 将错误文档文件保存在本地。

   错误文档名称区分大小写，必须与启用静态网站托管时输入的名称完全匹配。例如，如果在**静态网站托管**对话框中为**错误文档**名称输入 `404.html`，则错误文档文件名也必须是 `404.html`。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要用于托管静态网站的存储桶的名称。

1. 为您的存储桶启用静态网站托管，并输入错误文档的确切名称（例如 `404.html`）。有关更多信息，请参阅[启用网站托管](EnableWebsiteHosting.md)和[配置自定义错误文档](CustomErrorDocSupport.md)。

   启用静态网站托管后，继续执行步骤 6。

1. 要将错误文档上传到存储桶，请执行以下操作之一：
   + 将错误文档文件拖放到控制台存储桶列表中。
   + 选择**上传**，然后按照提示选择并上传索引文件。

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

## 步骤 7：测试您的网站端点
<a name="step7-test-web-site"></a>

为存储桶配置静态网站托管后，您可以测试您的网站端点。

**注意**  
Amazon S3 不支持对该网站进行 HTTPS 访问。如果要使用 HTTPS，则可以使用 Amazon CloudFront 为 Amazon S3 上托管的静态网站提供服务。  
有关更多信息，请参阅[如何使用 CloudFront 为 Amazon S3 上托管的静态网站提供服务？](https://www.amazonaws.cn/premiumsupport/knowledge-center/cloudfront-serve-static-website/)以及[要求在查看器和 CloudFront 之间使用 HTTPS 进行通信](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html)。

1. 在 **Buckets（存储桶）**下，请选择存储桶的名称。

1. 请选择**属性**。

1. 在页面底部的 **Static website hosting（静态网站托管）**下，请选择 **Bucket website endpoint（存储桶网站端点）**。

   您的索引文档将在单独的浏览器窗口中打开。

现在，您已拥有在 Amazon S3 上托管的网站。该网站在 Amazon S3 网站端点上可用。但是，您可能有要用来从已创建的网站提供内容的域 (如 `example.com`)。您可能还需要使用 Amazon S3 的根域支持来响应对 `http://www.example.com` 和 `http://example.com` 的请求。此操作需要其他步骤。有关示例，请参阅[教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md)。

## 步骤 8：清除
<a name="getting-started-cleanup-s3-website-overview"></a>

如果您仅出于练习目的创建静态网站，则删除您所分配的 Amazon 资源，使其不再产生费用。删除 Amazon 资源后，您的网站将不再可用。有关更多信息，请参阅 [删除通用存储桶](delete-bucket.md)。

# 在中国托管 Amazon S3 静态网站
<a name="static-website-hosting-china"></a>

**重要**  
在 2025 年 1 月 6 日之前，您应该重访您的静态网站和 S3 存储桶配置，以确保您通过 ICP 备案或 ICP 许可证使用自定义域名。否则，您的网站可能会受到中国监管要求的影响。

Amazon Web Services 提供多种托管静态网站的方式。Amazon S3 使用服务器端呈现将预构建的 HTML、CSS 和 JavaScript 文件呈现给网络浏览器，这为托管来自 S3 存储桶的网页提供了解决方案。您可以在 S3 存储桶中托管您的网站，并将您的域名直接链接到该网站。您还可以将 Amazon S3 与内容分发网络（CDN）（如 Amazon CloudFront）结合使用来交付网页。CDN 可将延迟减少到毫秒，从而加速向客户交付网站内容。

本主题概述了在 Amazon Web Services 中国（北京）和中国（宁夏）区域取得互联网内容提供商（ICP）备案和通过自定义域名访问您的网站的流程。要在中国托管静态网站，中国法规要求您首先从 ICP 备案系统取得备案或从政府主管部门获得 ICP 许可证。没有 ICP 备案或 ICP 许可证的域不得在中国提供互联网信息服务。除了帮助您遵守法规外，自定义域还比 S3 网站端点更具优势。自定义域比 S3 网站端点更易于记住。搜索引擎也会记录自定义域并将它们编入索引，这可以帮助客户找到您的网站。

## 先决条件
<a name="static-website-hosting-china-prerequisites"></a>

在将自定义域配置为在 Amazon Web Services 中国（北京）区域和中国（宁夏）区域托管 S3 静态网站之前，您必须满足以下先决条件。

### 取得 ICP 备案
<a name="prerequisites-icp-recordal"></a>

如果您的域名通过 Amazon Web Services 中国（宁夏）区域中由宁夏西云数据科技有限公司 （NWCD）运营的服务器进行公共访问，您必须通过 NWCD 申请 ICP 备案。

如果您的域名通过 Amazon Web Services 中国（北京）区域中由北京光环新网科技股份有限公司 （Sinnet）运营的服务器进行公共访问，您必须通过 Sinnet 申请 ICP 备案。

如果您申请 ICP 备案，则审核过程可能需要 3-20 天。有关 ICP 备案过程的更多信息，包括常见问题解答、下载和详细说明，请参阅 [ICP 备案](https://www.amazonaws.cn/support/icp/)。

**确认域名是否有 ICP 备案**

如果您不知道自己是否已经有 ICP 备案，可以在工业和信息化部网站上查看现有的 ICP 备案。

1. 打开工业和信息化部的 ICP 备案网站，网址为 [https://beian.miit.gov.cn](https://beian.miit.gov.cn)。

1. 根据网站上的说明输入查询关键字。

1. 要查看您的域名或实体是否已提交 ICP 备案，请在搜索框中输入您的信息。

### 配置 Amazon S3 静态网站
<a name="prerequisites-configure-s3-website"></a>

将自定义域映射到 S3 端点之前，您必须满足以下先决条件。如果您尚未完成这些先决条件，请参阅[教程：使用注册到 Route 53 的自定义域配置静态网站](website-hosting-custom-domain-walkthrough.md)中的步骤 1–10。

1. 向域名注册商注册您的自定义域。

1. 创建域存储桶和可选的子域存储桶：

   1. 对于您的[域](website-hosting-custom-domain-walkthrough.md#root-domain-walkthrough-configure-bucket-aswebsite)存储桶，启用静态网站托管，然后上传您的网站内容。启用静态网站托管后，您的域存储桶会被分配一个 S3 网站端点，例如 `www.example.com.cn.s3-website.cn-north-1.amazonaws.com.cn`。您将使用此网站端点配置 Route 53 自定义域。

   1. 对于您的[子域](website-hosting-custom-domain-walkthrough.md#root-domain-walkthrough-configure-redirect)存储桶，在**静态网站托管**下，为对象配置重定向请求，以重定向至上传到您的域存储桶的网站内容。

   您的域存储桶包含构成您网站的文件。您的子域存储桶会将请求重新路由到您的域存储桶。例如，如果客户进入 `www.example.com.cn`，您的子域存储桶会将请求转发到您的域存储桶：`example.com.cn`。

1. 清除所有四种 [S3 屏蔽公共访问权限](WebsiteAccessPermissionsReqd.md#block-public-access-static-site)设置。您必须清除所有“屏蔽公共访问权限”设置，以便您可以添加允许对存储桶进行公共读取访问的存储桶策略。

1. 添加允许对您的存储桶进行公共读取访问的[存储桶策略](WebsiteAccessPermissionsReqd.md#bucket-policy-static-site)。当您添加授予公共读取访问权限的存储桶策略时，客户可以访问您的网站内容。

## 使用 Route 53 配置自定义域
<a name="static-website-hosting-china-route-53"></a>

在取得 ICP 备案并完成在 Amazon S3 中配置静态网站的先决条件后，您可以将自定义域名映射到 Amazon S3 静态网站并通过自定义域访问您的网站。以下过程使用 Route 53 作为域名管理器。如果您使用其他域名注册商而不是 Route 53，则必须按照适用于该域名注册商的类似步骤，将自定义域映射到 S3 网站端点。有关详细步骤，请联系您的域名注册商。

**将您的自定义域映射到 S3 网站端点**

完成在 Amazon S3 中配置静态网站的先决条件后，您就有了网站端点，例如 `www.example.com.cn.s3-website.cn-north-1.amazonaws.com.cn`（`www.example.com.cn`）。要为您的域和子域配置别名记录，请按照以下步骤操作：

1. 通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

1. 请选择**托管区域**。

1. 在托管区域列表中，请选择与您的域名匹配的托管区域的名称。

1. 要为您的托管区创建别名记录，请选择**创建记录**。  
![\[Route 53 控制台，显示了托管区详细信息部分，其中突出显示了编辑托管区按钮。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/static-website-hosting-china-1.png)

1. 请选择**切换到向导**。  
![\[Route 53 控制台，显示了创建记录页面，其中突出显示了切换到向导文本。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/static-website-hosting-china-2.png)

1. 请选择**简单路由**，然后选择**下一步**。

1. 请选择**定义简单记录**。  
![\[Route 53 控制台，显示了创建别名记录向导中的定义简单记录屏幕。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/static-website-hosting-china-3.png)

   1. 对于**记录名称**，接受默认值。

   1. 对于**记录类型**，选择 **CNAME 将流量路由到另一个域名和某些 Amazon Web Services 资源**。

   1. 对于**值/流量路由至**，选择**根据记录类型选择 IP 地址或其他值**。在文本框中，输入 S3 网站端点：`s3-website.cn-north-1.amazonaws.com.cn`。

   1. 请选择**定义简单记录**。

1. （可选）如果您为子域存储桶配置了重定向，请为子域存储桶执行步骤 2-7。

1. 验证您的网站和重定向是否有效：

   1. 通过自定义域名（例如 `http://example.com.cn`）访问您的网站。

   1. 如果您配置了子域存储桶，请通过您的子域（例如 `http://www.example.com.cn`）访问您的网站。

## 重新配置在 Amazon S3 中托管的网站
<a name="static-website-hosting-china-reconfiguring"></a>

如果您已经有一个在 Amazon S3 中托管的静态网站，并且您的域名已有 ICP 备案，则可以通过四种方式将您的域名直接链接到 S3 存储桶。Amazon S3 提供以下选项：
+ **将域链接到 S3 存储桶** - 如果 S3 存储桶名称与网站域名相同（例如，存储桶名称为 `example.cn`，网站名称为 `example.cn`），请按照域名提供商提供的说明将您的域链接到 S3 存储桶。这些说明因每个提供商而异。

  创建 S3 存储桶后，您无法更改存储桶名称。如果存储桶名称与网站域名不同，则可以执行以下操作之一：
+ **购买新域** - 您可以购买名称与存储桶名称相同的新域，获取 ICP 备案，然后按照域名提供商提供的步骤将域名链接到存储桶。
+ **将网站内容移至名称与域名相同的新存储桶** - 您可以使用与网站域名相同的名称创建一个新存储桶，获取 ICP 记录，然后按照域提供商提供的步骤将域链接到网站存储桶。如果存储桶名称不可用，则可以使用 Amazon CloudFront，如下一个要点所述。
+ **使用 Amazon CloudFront 将域映射到域名与存储桶名称不同的存储桶名称** – 要使用 CloudFront 将您的域名映射到您的存储桶，请执行以下操作：
  + 按照[步骤 2：创建 CloudFront 分配](https://docs.amazonaws.cn/en_us/AmazonCloudFront/latest/DeveloperGuide/GettingStarted.SimpleDistribution.html#GettingStartedCreateDistribution)来创建映射到存储桶的 CloudFront 分配。对于来源配置中的**来源访问**权限，请使用来源访问身份（OAI），但不要接受其默认值。
  + 按照[添加备用域名](https://docs.amazonaws.cn/en_us/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html#CreatingCNAME)向您的 CloudFront 分配添加备用域名。
  + 在 CloudFront 分配正常运行后，禁用 S3 静态网站托管，并从您的存储桶策略中删除公共读取访问声明。

**注意**  
 除非您的域名有 ICP 备案，否则 CloudFront 不会处理您的请求。

## 通过您的自定义域访问您的网站
<a name="static-website-hosting-china-accessing"></a>

将静态网站配置为使用自定义域后，必须更新所有位置中之前通过引用 S3 网站端点 URL 而指向 S3 网站的所有链接。例如，您必须更新您的文档页面、电子邮件新闻稿等，让它们使用新的自定义域。您的自定义域将更容易被您的客户记住，当客户在搜索中使用关键字时，他们将能够在搜索引擎中找到您的网站。

# 教程：使用注册到 Route 53 的自定义域配置静态网站
<a name="website-hosting-custom-domain-walkthrough"></a>

假设您要在 Amazon S3 上托管静态网站。您向 Amazon Route 53 注册了一个域（如 `example.com`），希望从 Amazon S3 内容响应对 `http://www.example.com` 和 `http://example.com` 的请求。您可以使用本演练了解如何托管静态网站以及在 Amazon S3 上为具有注册到 Route 53 的自定义域名的网站创建重定向。您可以使用要在 Amazon S3 上托管的现有网站，也可以使用本演练从头开始。

完成本演练后，您可以选择使用 Amazon CloudFront 来提高网站的性能。有关更多信息，请参阅 [使用 Amazon CloudFront 为网站提速](website-hosting-cloudfront-walkthrough.md)。

**注意**  
Amazon S3 网站端点不支持 HTTPS 或接入点。如果要使用 HTTPS，则可以使用 Amazon CloudFront 为 Amazon S3 上托管的静态网站提供服务。  
有关如何使用 CloudFront 和 Amazon S3 安全地托管内容的教程，请参阅[教程：使用 Amazon S3、Amazon CloudFront 和 Amazon Route 53 托管点播流视频](tutorial-s3-cloudfront-route53-video-streaming.md)。有关更多信息，请参阅[如何使用 CloudFront 为 Amazon S3 上托管的静态网站提供服务？](https://www.amazonaws.cn/premiumsupport/knowledge-center/cloudfront-serve-static-website/)以及[要求在查看器和 CloudFront 之间使用 HTTPS 进行通信](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html)。

**使用 Amazon CloudFormation 模板自动设置静态网站**  
可以使用 Amazon CloudFormation 模板自动设置静态网站。Amazon CloudFormation 模板设置托管安全静态网站所需的组件，这样您便能更多地关注网站内容而不是配置组件。

Amazon CloudFormation 模板包含以下组件：
+ Amazon S3 – 创建一个 Amazon S3 存储桶来托管静态网站。
+ CloudFront – 创建 CloudFront 分配来为静态网站提速。
+ Lambda@Edge – 使用 [Lambda@Edge](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html) 向每个服务器响应添加安全标头。安全标头是 Web 服务器响应中的一组标头，它们告诉 Web 浏览器采取额外的安全预防措施。有关更多信息，请参阅博客文章：[使用 Lambda@Edge 和 Amazon CloudFront 添加 HTTP 安全标头](https://www.amazonaws.cn/blogs/networking-and-content-delivery/adding-http-security-headers-using-lambdaedge-and-amazon-cloudfront/)。

此 Amazon CloudFormation 模板可供您下载和使用。有关信息和说明，请参阅《Amazon CloudFront 开发人员指南》**中的[安全静态网站入门](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。

**Topics**
+ [开始前的准备工作](#root-domain-walkthrough-before-you-begin)
+ [步骤 1：将自定义域注册到 Route 53](#website-hosting-custom-domain-walkthrough-domain-registry)
+ [步骤 2：创建两个存储桶](#root-domain-walkthrough-create-buckets)
+ [步骤 3：为网站托管配置根域存储桶](#root-domain-walkthrough-configure-bucket-aswebsite)
+ [步骤 4：为网站重定向配置子域存储桶](#root-domain-walkthrough-configure-redirect)
+ [步骤 5：配置网站流量的日志记录](#root-domain-walkthrough-configure-logging)
+ [步骤 6：上传索引和网站内容](#upload-website-content)
+ [步骤 7：上传错误文档](#configure-error-document-root-domain)
+ [步骤 8：编辑 S3 屏蔽公共访问权限设置](#root-domain-walkthrough-configure-bucket-permissions)
+ [步骤 9：附加存储桶策略](#add-bucket-policy-root-domain)
+ [步骤 10：测试您的域端点](#root-domain-walkthrough-test-website)
+ [步骤 11：为您的域和子域添加别名记录](#root-domain-walkthrough-add-record-to-hostedzone)
+ [步骤 12：测试网站](#root-domain-testing)
+ [使用 Amazon CloudFront 为网站提速](website-hosting-cloudfront-walkthrough.md)
+ [清理示例资源](getting-started-cleanup.md)

## 开始前的准备工作
<a name="root-domain-walkthrough-before-you-begin"></a>

在按照此示例中的步骤操作时，您将使用以下服务：

**Amazon Route 53** – 您使用 Route 53 注册域，并定义要将您的域的 Internet 流量路由到何处。此示例介绍如何创建 Route 53 别名记录，以便将您的域（`example.com`）和子域（`www.example.com`）的流量路由到包含 HTML 文件的 Amazon S3 存储桶。

**Amazon S3** – 您将使用 Amazon S3 创建存储桶、上传示例网站页面、配置权限以便每个人都可以查看内容，然后为网站托管配置存储桶。

## 步骤 1：将自定义域注册到 Route 53
<a name="website-hosting-custom-domain-walkthrough-domain-registry"></a>

如果您还没有已注册的域名（如 `example.com`），则可向 Route 53 注册一个域名。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[注册新域](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-register.html)。注册您的域名后，您可以为网站托管创建并配置 Amazon S3 存储桶。

## 步骤 2：创建两个存储桶
<a name="root-domain-walkthrough-create-buckets"></a>

要同时支持来自根域和子域的请求，您需要创建以下两个存储桶。
+ **域存储桶** – `example.com`
+ **子域存储桶** – `www.example.com` 

这两个存储桶的名称必须与您的域名完全匹配。在此示例中，域名为 `example.com`。您将您的内容托管在根域存储桶（`example.com`）之外。您为子域存储桶（`www.example.com`）创建重定向请求。如果有人在其浏览器中输入 `www.example.com`，他们将重定向到 `example.com` 并看到该名称的 Amazon S3 存储桶中托管的内容。

**为网站托管创建存储桶**

以下说明概述了如何创建存储桶以用于网站托管。有关创建存储桶的详细分步说明，请参阅[创建通用存储桶](create-bucket-overview.md)。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择根域存储桶：

   1. 在页面顶部的导航栏中，选择当前所显示 Amazon Web Services 区域的名称。接下来，选择要在其中创建存储桶的区域。
**注意**  
要最大程度地减少延迟和成本以及满足法规要求，请选择一个靠近您的区域。在某一区域存储的对象将一直留在该区域，除非您特意将其转移到其他区域。有关 Amazon S3 Amazon Web Services 区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Web Services 服务 端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

   1. 在左侧导航窗格中，选择**通用存储桶**。

   1. 选择**创建存储桶**。此时将打开**创建存储桶**页面。

   1. 输入 **Bucket name（存储桶名称）**（例如 **example.com**）。

   1. 请选择要在其中创建存储桶的区域。

      请选择一个在地理上靠近您的区域可最大程度地减少延迟和成本，或满足法规要求。您选择的区域决定了您的 Amazon S3 网站端点。有关更多信息，请参阅 [网站端点](WebsiteEndpoints.md)。

   1. 要接受默认设置并创建存储桶，请选择 **Create（创建）**。

1. 创建您的子域存储桶：

   1. 请选择 **Create bucket（创建存储桶）**。

   1. 输入 **Bucket name（存储桶名称）**（例如 **www.example.com**）。

   1. 请选择要在其中创建存储桶的区域。

      请选择一个在地理上靠近您的区域可最大程度地减少延迟和成本，或满足法规要求。您选择的区域决定了您的 Amazon S3 网站端点。有关更多信息，请参阅 [网站端点](WebsiteEndpoints.md)。

   1. 要接受默认设置并创建存储桶，请选择 **Create（创建）**。

在下一步中，您配置 `example.com` 进行网站托管。

## 步骤 3：为网站托管配置根域存储桶
<a name="root-domain-walkthrough-configure-bucket-aswebsite"></a>

在此步骤中，您将根域存储桶（`example.com`）配置为网站。该存储桶将包含您的网站内容。为网站托管配置存储桶时，您可以使用[网站端点](WebsiteEndpoints.md)访问网站。

**启用静态网站托管**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要为其启用静态网站托管的存储桶的名称。

1. 选择**属性**。

1. 在**静态网站托管**下，请选择**编辑**。

1. 请选择**使用此存储桶托管网站**。

1. 在**静态网站托管**下，请选择**启用**。

1. 在 **Index document (索引文档)** 中，输入索引文档的文件名，通常为 `index.html`。

   索引文档名称区分大小写，并且必须与您计划上传到 S3 存储桶的 HTML 索引文档的文件名完全匹配。当您为网站托管配置存储桶时，您必须指定索引文档。当对根域或任何子文件夹发出请求时，Amazon S3 将返回此索引文档。有关更多信息，请参阅 [配置索引文档](IndexDocumentSupport.md)。

1. 要为 4XX 类错误提供您自己的自定义错误文档，请在**错误文档**中输入自定义错误文档文件名。

   错误文档名称区分大小写，并且必须与您计划上传到 S3 存储桶的 HTML 错误文档的文件名完全匹配。如果未指定自定义错误文档并发生错误，Amazon S3 返回默认 HTML 错误文档。有关更多信息，请参阅 [配置自定义错误文档](CustomErrorDocSupport.md)。

1. （可选）如果要指定高级重定向规则，请在 **Redirection rules**（重定向规则）中，输入 JSON 来描述规则。

   例如，您可以根据请求中的特定对象键名或前缀按条件路由请求。有关更多信息，请参阅 [配置重新导向规则以使用高级条件重新导向](how-to-page-redirect.md#advanced-conditional-redirects)。

1. 选择 **Save changes（保存更改）**。

   Amazon S3 为您的存储桶启用静态网站托管。在页面底部的**静态网站托管**下，您可以看到存储桶的网站端点。

1. 在**静态网站托管**下，记下**端点**。

   **端点**是存储桶的 Amazon S3 网站端点。将存储桶配置为静态网站后，您可以使用此端点来测试您的网站。

在[编辑屏蔽公共访问权限设置](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#root-domain-walkthrough-configure-bucket-permissions)并[添加允许公有读取访问的存储桶策略](https://docs.amazonaws.cn/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#add-bucket-policy-root-domain)后，您可以使用网站端点访问您的网站。

在下一步中，您将子域 (`www.example.com`) 配置为将请求重定向到您的域 (`example.com`)。

## 步骤 4：为网站重定向配置子域存储桶
<a name="root-domain-walkthrough-configure-redirect"></a>

在为网站托管配置了根域存储桶后，可以将子域存储桶配置为将所有请求重定向到该域。在此示例中，对 `www.example.com` 的所有请求都重定向到 `example.com`。

**配置重定向请求**

1. 在 Amazon S3 控制台上的**通用存储桶**列表中，选择子域存储桶名称（在本例中为 `www.example.com`）。

1. 选择**属性**。

1. 在**静态网站托管**下，选择**编辑**。

1. 请选择 **Redirect requests for an object**（重新导向对于对象的请求）。

1. 在 **Target bucket（目标存储桶）**框中，输入您的根域（例如 **example.com**）。

1. 对于 **Protocol**（协议），请选择 **http**。

1. 选择**保存更改**。

## 步骤 5：配置网站流量的日志记录
<a name="root-domain-walkthrough-configure-logging"></a>

如果想要跟踪访问您的网站的访问者人数，则可以选择对根域存储桶启用日志记录。有关更多信息，请参阅 [使用服务器访问日志记录来记录请求](ServerLogs.md)。如果您计划使用 Amazon CloudFront 来为网站提速，也可以使用 CloudFront 日志记录。

**为根域存储桶启用服务器访问日志记录**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 例如，在您创建存储桶（配置为静态网站）的同一区域中，创建用于日志记录的存储桶（例如 `logs.example.com`）。

1. 为服务器访问日志记录日志文件创建文件夹（例如，`logs`）。

1. （可选）如果要使用 CloudFront 提高网站性能，请为 CloudFront 日志文件创建一个文件夹（例如，`cdn`）。
**重要**  
当您创建或更新分配并启用 CloudFront 日志记录时，CloudFront 会更新存储桶访问控制列表（ACL），以提供 `awslogsdelivery` 账户授予将日志写入存储桶的 `FULL_CONTROL` 权限。有关更多信息，请参阅 *Amazon CloudFront Developer Guide*（Amazon CloudFront 开发人员指南）中的 [Permissions required to configure standard logging and to access your log files](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#AccessLogsBucketAndFileOwnership)（配置标准日志和访问日志文件所需的权限）。如果存储日志的存储桶使用 S3 对象所有权的强制存储桶拥有者设置来禁用 ACL，则 CloudFront 无法将日志写入存储桶。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

1. 在 **Buckets**（存储桶）列表中，请选择您的根域存储桶。

1. 请选择**属性**。

1. 在 **Server access logging**（服务器访问日志记录）下，请选择 **Edit**（编辑）。

1. 请选择 **Enable**。

1. 在 **Target bucket**（目标存储桶）下，请选择服务器访问日志的存储桶和文件夹目标：
   + 浏览到文件夹和存储桶位置：

     1. 请选择 **Browse S3**（浏览 S3）。

     1. 请选择存储桶名称，然后选择日志文件夹。

     1. 请选择 **Choose path**（选择路径）。
   + 输入 S3 存储桶路径，例如 `s3://logs.example.com/logs/`。

1. 选择**保存更改**。

   在日志存储桶中，您现在可以访问日志。Amazon S3 每 2 小时将网站访问日志写入您的日志存储桶一次。

## 步骤 6：上传索引和网站内容
<a name="upload-website-content"></a>

在此步骤中，您可以将索引文档和可选网站内容上传到您的根域存储桶。

当您为存储桶启用静态网站托管时，您可以输入索引文档的名称（例如，**index.html**）。为存储桶启用静态网站托管后，您可以将具有此索引文档名称的 HTML 文件上传到存储桶。

**配置索引文档**

1. 创建 `index.html` 文件。

   如果您没有 `index.html` 文件，则可以使用以下 HTML 创建一个：

   ```
   <html xmlns="http://www.w3.org/1999/xhtml" >
   <head>
       <title>My Website Home Page</title>
   </head>
   <body>
     <h1>Welcome to my website</h1>
     <p>Now hosted on Amazon S3!</p>
   </body>
   </html>
   ```

1. 将索引文件保存在本地。

   索引文档文件名必须与您在**静态网站托管**对话框中输入的索引文档名称完全匹配。索引文档名称区分大小写。例如，如果在**静态网站托管**对话框中为**索引文档**名称输入 `index.html`，则索引文档文件名也必须是 `index.html`，而不是 `Index.html`。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要用于托管静态网站的存储桶的名称。

1. 为您的存储桶启用静态网站托管，并输入索引文档的确切名称（例如 `index.html`）。有关更多信息，请参阅 [启用网站托管](EnableWebsiteHosting.md)。

   启用静态网站托管后，继续执行步骤 6。

1. 要将索引文档上传到存储桶，请执行以下操作之一：
   + 将索引文件拖放到控制台存储桶列表中。
   + 选择**上传**，然后按照提示选择并上传索引文件。

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

1. （可选）将其他网站内容上传到您的存储桶。

## 步骤 7：上传错误文档
<a name="configure-error-document-root-domain"></a>

当您为存储桶启用静态网站托管时，请输入错误文档的名称（例如，**404.html**）。为存储桶启用静态网站托管后，您可以将具有此错误文档名称的 HTML 文件上传到存储桶。

**要配置错误文档**

1. 创建错误文档，例如 `404.html`。

1. 将错误文档文件保存在本地。

   错误文档名称区分大小写，必须与启用静态网站托管时输入的名称完全匹配。例如，如果在**静态网站托管**对话框中为**错误文档**名称输入 `404.html`，则错误文档文件名也必须是 `404.html`。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要用于托管静态网站的存储桶的名称。

1. 为您的存储桶启用静态网站托管，并输入错误文档的确切名称（例如 `404.html`）。有关更多信息，请参阅[启用网站托管](EnableWebsiteHosting.md)和[配置自定义错误文档](CustomErrorDocSupport.md)。

   启用静态网站托管后，继续执行步骤 6。

1. 要将错误文档上传到存储桶，请执行以下操作之一：
   + 将错误文档文件拖放到控制台存储桶列表中。
   + 选择**上传**，然后按照提示选择并上传索引文件。

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

## 步骤 8：编辑 S3 屏蔽公共访问权限设置
<a name="root-domain-walkthrough-configure-bucket-permissions"></a>

在此示例中，您编辑域存储桶（`example.com`）的屏蔽公共访问权限设置以允许公有访问。

默认情况下，Amazon S3 阻止对您的账户和存储桶的公有访问权限。如果要使用存储桶托管静态网站，您可以使用以下步骤编辑您的屏蔽公共访问权限设置。

**警告**  
在完成这些步骤之前，请查看[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)，来确保您了解并接受支持公共访问权限所涉及的风险。当您关闭屏蔽公共访问权限设置以使您的存储桶变为公有时，Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 请选择已配置为静态网站的存储桶的名称。

1. 选择**权限**。

1. 在**屏蔽公共访问权限（存储桶设置）**下，请选择**编辑**。

1. 清除**阻止*所有*公有访问**，然后选择**保存更改**。  
![\[Amazon S3 控制台，显示屏蔽公共访问权限存储桶设置。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/edit-public-access-clear.png)

   Amazon S3 关闭了存储桶的屏蔽公共访问权限设置。要创建公有静态网站，可能还必须[为您的账户配置屏蔽公共访问权限设置](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/block-public-access-account.html)，然后再添加存储桶策略。如果当前已开启账户的屏蔽公共访问权限设置，您将在**屏蔽公共访问权限（存储桶设置）**下看到一条备注。

## 步骤 9：附加存储桶策略
<a name="add-bucket-policy-root-domain"></a>

在此示例中，您将存储桶策略附加到域存储桶（`example.com`）以允许进行公有读取访问。例如，您可以将示例存储桶策略中的 *Bucket-Name* 替换为域存储桶的名称，例如 `example.com`。

在编辑 S3 屏蔽公共访问权限设置后，您可以添加存储桶策略以授予对存储桶的公有读取访问权限。当您授予公有读取访问权限时，Internet 上的任何人都可以访问您的存储桶。

**重要**  
下面的策略仅供举例说明，仍允许完全访问您存储桶的内容。在继续执行此步骤之前，请查看[如何保护 Amazon S3 存储桶中的文件？](https://www.amazonaws.cn/premiumsupport/knowledge-center/secure-s3-resources/)，以确保您了解保护 S3 存储桶中文件的最佳实践以及授予公有访问权限所涉及的风险。

1. 在**存储桶** 下，请选择存储桶的名称。

1. 选择**权限**。

1. 在**存储桶策略**下，请选择**编辑**。

1. 要授予对网站的公有读取访问权限，请复制以下存储桶策略，将其粘贴到**存储桶策略编辑器**中。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PublicReadGetObject",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::Bucket-Name/*"
               ]
           }
       ]
   }
   ```

1. 将 `Resource` 更新为您的存储桶名称。

   在上述示例存储桶策略中，*Bucket-Name* 是存储桶名称的占位符。要将此存储桶策略用于您自己的存储桶，您必须更新此名称以匹配您的存储桶名称。

1. 选择**保存更改**。

   此时将显示一条消息，指示存储桶策略已成功添加。

   如果您看到显示 `Policy has invalid resource` 的错误，请确认存储桶策略中的存储桶名称与您的存储桶名称匹配。有关添加存储桶策略的信息，请参阅[如何添加 S3 存储桶策略？](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/add-bucket-policy.html)

   如果您收到错误消息且无法保存存储桶策略，请检查您的账户和存储桶的屏蔽公共访问权限设置以确认您允许对存储桶进行公有访问。

在下一步中，您可以找出您的网站端点并测试您的域端点。

## 步骤 10：测试您的域端点
<a name="root-domain-walkthrough-test-website"></a>

在将您的域存储桶配置为托管公有网站之后，可以测试您的端点。有关更多信息，请参阅 [网站端点](WebsiteEndpoints.md)。您只能测试域存储桶的端点，因为您的子域存储桶是为网站重定向设置的，而不是静态网络托管。

**注意**  
Amazon S3 不支持对该网站进行 HTTPS 访问。如果要使用 HTTPS，则可以使用 Amazon CloudFront 为 Amazon S3 上托管的静态网站提供服务。  
有关更多信息，请参阅[如何使用 CloudFront 为 Amazon S3 上托管的静态网站提供服务？](https://www.amazonaws.cn/premiumsupport/knowledge-center/cloudfront-serve-static-website/)以及[要求在查看器和 CloudFront 之间使用 HTTPS 进行通信](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html)。

1. 在 **Buckets（存储桶）**下，请选择存储桶的名称。

1. 请选择**属性**。

1. 在页面底部的 **Static website hosting（静态网站托管）**下，请选择 **Bucket website endpoint（存储桶网站端点）**。

   您的索引文档将在单独的浏览器窗口中打开。

接下来，您使用 Amazon Route 53 使客户能够使用这两个自定义 URL 导航到您的站点。

## 步骤 11：为您的域和子域添加别名记录
<a name="root-domain-walkthrough-add-record-to-hostedzone"></a>

在此步骤中，您创建别名记录并将其添加到您的域的托管区域，而这些别名记录将映射 `example.com` 和 `www.example.com`。别名记录使用 Amazon S3 网站端点，而不使用 IP 地址。Amazon Route 53 保留了别名记录和 Amazon S3 存储桶所在的 IP 地址之间的映射。您创建两个别名记录，一个用于根域，一个用于子域。

### 为根域和子域添加别名记录
<a name="add-alis-record"></a>

**为您的根域 (`example.com`) 添加别名记录**

1. 通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。
**注意**  
如果您尚未使用 Route 53，请参阅 *Amazon Route 53 开发人员指南*中的[步骤 1：注册域](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/getting-started.html#getting-started-find-domain-name)。完成设置后，可继续按说明操作。

1. 请选择**托管区域**。

1. 在托管区域列表中，请选择与您的域名匹配的托管区域的名称。

1. 请选择**创建记录**。

1. 请选择**切换到向导**。
**注意**  
如果要使用快速创建来创建别名记录，请参阅[配置 Route 53 以将流量路由到 S3 存储桶](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/RoutingToS3Bucket.html#routing-to-s3-bucket-configuring)。

1. 请选择**简单路由**，然后选择**下一步**。

1. 请选择**定义简单记录**。

1. 在**记录名称**中，接受默认值，该值为您的托管区域和您的域的名称。

1. 在**值/流量路由至**中，请选择**向 S3 网站端点添加别名**。

1. 请选择区域。

1. 请选择 S3 存储桶。

   存储桶名称应与 **Name（名称）**框中显示的名称相匹配。例如，在**选择 S3 存储桶**列表中，存储桶名称将与创建存储桶所在区域的 Amazon S3 网站端点一起显示 `s3-website-us-west-1.amazonaws.com (example.com)`。

   如果出现以下情况，请选择** S3 存储桶**将列出一个存储桶：
   + 您已将存储桶配置为静态网站。
   + 存储桶名称与您正在创建的记录的名称相同。
   + 当前 Amazon Web Services 账户 创建了存储桶。

   如果您的存储桶未显示在**选择 S3 存储桶**列表中，请输入在其中创建存储桶的区域的 Amazon S3 网站端点，例如 **s3-website-us-west-2.amazonaws.com**。有关 Amazon S3 网站端点的完整列表，请参阅 [Amazon S3 网站端点](https://docs.amazonaws.cn/general/latest/gr/s3.html#s3_website_region_endpoints)。有关别名目标的更多信息，请参阅 * Amazon Route 53 开发人员指南*中的[ 值/路由流量至](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/resource-record-sets-values-alias.html#rrsets-values-alias-alias-target)。

1. 在**记录类型**中，请选择** A- 将流量路由到 IPv4 地址和某些 Amazon 资源**。

1. 对于**评估目标运行状况**，请选择**否**。

1. 请选择**定义简单记录**。

**为您的子域添加别名记录 (`www.example.com`)**

1. 在**配置记录**下，请选择**定义简单记录**。

1. 在子域的**记录名称**中，键入 `www`。

1. 在**值/流量路由至**中，请选择**向 S3 网站端点添加别名**。

1. 请选择区域。

1. 请选择 S3 存储桶，例如 `s3-website-us-west-2.amazonaws.com (www.example.com)`。

   如果您的存储桶未显示在**选择 S3 存储桶**列表中，请输入在其中创建存储桶的区域的 Amazon S3 网站端点，例如 **s3-website-us-west-2.amazonaws.com**。有关 Amazon S3 网站端点的完整列表，请参阅 [Amazon S3 网站端点](https://docs.amazonaws.cn/general/latest/gr/s3.html#s3_website_region_endpoints)。有关别名目标的更多信息，请参阅 * Amazon Route 53 开发人员指南*中的[ 值/路由流量至](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/resource-record-sets-values-alias.html#rrsets-values-alias-alias-target)。

1. 在**记录类型**中，请选择** A- 将流量路由到 IPv4 地址和某些 Amazon 资源**。

1. 对于**评估目标运行状况**，请选择**否**。

1. 请选择**定义简单记录**。

1. 在**配置记录**页面上，请选择**创建记录**。

**注意**  
更改通常在 60 秒内传播到所有 Route 53 服务器。传播完成后，您可以使用在此步骤中创建的别名记录的名称将流量路由到 Amazon S3 存储桶。

### 为根域和子域添加别名记录（旧 Route 53 控制台）
<a name="add-alis-record-old"></a>

**为您的根域 (`example.com`) 添加别名记录**

Route 53 控制台进行了重新设计。在 Route 53 控制台中，您可以暂时使用旧控制台。如果您选择使用旧 Route 53 控制台，请使用以下过程。

1. 通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。
**注意**  
如果您尚未使用 Route 53，请参阅 *Amazon Route 53 开发人员指南*中的[步骤 1：注册域](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/getting-started.html#getting-started-find-domain-name)。完成设置后，可继续按说明操作。

1. 请选择 **Hosted Zones (托管区域)**。

1. 在托管区域列表中，请选择与您的域名匹配的托管区域的名称。

1. 请选择 **Create Record Set**。

1. 指定以下值：  
**名称**  
接受默认值，该值为您的托管区域和您的域的名称。  
对于根域，您不需要在 **Name (名称)** 字段中输入任何其他信息。  
**类型**  
请选择 **A – IPv4 address（A – IPv4 地址）**。  
**别名**  
请选择**是**。  
**别名目标**  
在列表的 **S3 website endpoints（S3 网站端点）**部分，请选择您的存储桶名称。  
存储桶名称应与 **Name（名称）**框中显示的名称相匹配。在 **Alias Target（别名目标）**列表中，存储桶名称后跟在其中创建存储桶的区域的 Amazon S3 网站端点，例如 `example.com (s3-website-us-west-2.amazonaws.com)`。**Alias Target（别名目标）**会在以下情况下列出存储桶：  
   + 您已将存储桶配置为静态网站。
   + 存储桶名称与您正在创建的记录的名称相同。
   + 当前 Amazon Web Services 账户 创建了存储桶。
如果您的存储桶未显示在 **Alias Target**（别名目标）列表中，请输入在其中创建存储桶的区域的 Amazon S3 网站端点，例如 `s3-website-us-west-2`。有关 Amazon S3 网站端点的完整列表，请参阅 [Amazon S3 网站端点](https://docs.amazonaws.cn/general/latest/gr/s3.html#s3_website_region_endpoints)。有关别名目标的更多信息，请参阅 * Amazon Route 53 开发人员指南*中的[ 值/路由流量至](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/resource-record-sets-values-alias.html#rrsets-values-alias-alias-target)。  
**路由策略**  
接受默认值 **Simple**。  
**Evaluate Target Health**  
接受默认值 **No**。

1. 请选择**创建**。

**为您的子域添加别名记录 (`www.example.com`)**

1. 在您的根域 (`example.com`) 的托管区域中，请选择 **Create Record Set (创建记录集)**。

1. 指定以下值：  
**名称**  
对于子域，在框中输入 `www`。  
**类型**  
请选择 **A – IPv4 address（A – IPv4 地址）**。  
**别名**  
请选择**是**。  
**别名目标**  
在列表的 **S3 website endpoints（S3 网站端点）**部分中，请选择 **Name（名称）**字段中显示的相同存储桶名称，例如 `www.example.com (s3-website-us-west-2.amazonaws.com)`。  
**路由策略**  
接受默认值 **Simple**。  
**Evaluate Target Health**  
接受默认值 **No**。

1. 请选择**创建**。

**注意**  
更改通常在 60 秒内传播到所有 Route 53 服务器。传播完成后，您可以使用在此步骤中创建的别名记录的名称将流量路由到 Amazon S3 存储桶。

## 步骤 12：测试网站
<a name="root-domain-testing"></a>

验证网站和重定向正常工作。在浏览器中，输入 URL。在本示例中，可以尝试以下 URL：
+ **域**（`http://example.com`）– 显示 `example.com` 存储桶中的索引文档。
+ **子域** (`http://www.example.com`) – 将您的请求重定向到 `http://example.com`。您会在 `example.com` 存储桶中看到索引文档。

如果您的网站或重定向链接不起作用，则可以尝试以下操作：
+ **清除缓存** – 清除 Web 浏览器缓存。
+ **检查名称服务器** – 如果在清除缓存后，您的网页和重定向链接无法正常工作，则可以比较域的名称服务器和托管区域的名称服务器。如果名称服务器不匹配，您可能需要更新域名服务器，以便匹配在托管区域下方列出的服务器。有关更多信息，请参阅[为域添加或更改名称服务器和粘附记录](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/domain-name-servers-glue-records.html)。

在成功测试根域和子域后，您可以设置 [Amazon CloudFront](https://www.amazonaws.cn/cloudfront) 分配以提高网站的性能，并提供可用于查看网站流量的日志。有关更多信息，请参阅 [使用 Amazon CloudFront 为网站提速](website-hosting-cloudfront-walkthrough.md)。

# 使用 Amazon CloudFront 为网站提速
<a name="website-hosting-cloudfront-walkthrough"></a>

您可以使用 [Amazon CloudFront](https://www.amazonaws.cn/cloudfront) 来提高 Amazon S3 网站的性能。CloudFront 可将您的网站文件（如 HTML、图像和视频）提供给全球各地的数据中心（称为*边缘站点*）使用。当访问者从您的网站请求文件时，CloudFront 会自动将请求重定向到最近边缘站点上的文件副本。这时的下载速度会比访问者从更远的数据中心请求该内容更快。

CloudFront 会将内容在边缘站点上缓存您指定的时间。如果访问者请求已过期的缓存内容，CloudFront 会检查来源服务器，确定该内容是否有更新的版本可用。如果有更新的版本，则 CloudFront 将新版本复制到该边缘站点。当访问者请求内容时，您对原始内容所做的更改便会复制到边缘站点。

**在没有 Route 53 的情况下使用 CloudFront**  
本页面上的教程使用 Route 53 来指向您的 CloudFront 分配。但是，如果您想在不使用 Route 53 的情况下使用 CloudFront 提供托管在 Amazon S3 存储桶中的内容，请参阅 [Amazon CloudFront Tutorials: Setting up a Dynamic Content Distribution for Amazon S3](https://www.amazonaws.cn/cloudfront/getting-started/S3/)。在使用 CloudFront 提供托管在 Amazon S3 存储桶中的内容时，您可以使用任何存储桶名称，并且同时支持 HTTP 和 HTTPS。

**使用 Amazon CloudFormation 模板自动执行设置过程**  
有关使用 Amazon CloudFormation 模板配置安全静态网站以创建 CloudFront 分配来为您的网站提供服务的更多信息，请参阅《*Amazon CloudFront 开发人员指南*》中的[安全静态网站入门](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。

**Topics**
+ [步骤 1：创建 CloudFront 分配](#create-distribution)
+ [步骤 2：更新域和子域的记录集](#update-record-sets)
+ [（可选）步骤 3：检查日志文件](#check-log-files)

## 步骤 1：创建 CloudFront 分配
<a name="create-distribution"></a>

首先，创建 CloudFront 分配。这将使您的网站可供全球各地的数据中心使用。

**使用 Amazon S3 源创建分配**

1. 通过 打开 CloudFront 控制台[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)

1. 选择 **Create Distribution**。

1. 在 **Create Distribution**（创建分配）页面上的 **Origin Settings**（源设置）部分中，对于 **Origin Domain Name**（源域名），输入您的存储桶的 Amazon S3 网站端点，例如 **example.com.s3-website.us-west-1.amazonaws.com**。

   CloudFront 将为您填写 **Origin ID (源 ID)**。

1. 对于 **Default Cache Behavior Settings (默认缓存行为设置)**，将值保留设置为默认值。

   当为**查看器协议策略**使用默认设置时，您可以为静态网站使用 HTTPS。有关这些配置选项的更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[您创建或更新 Web 分配时指定的值](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/WorkingWithDownloadDistributions.html#DownloadDistValuesYouSpecify)。

1. 对于 **Distribution Settings**，执行以下操作：

   1. 将 **Price Class (价格级别)** 的设置保留为 **Use All Edge Locations (Best Performance) (使用所有节点 (最佳性能))**。

   1. 将 **Alternate Domain Names (CNAMEs)**（备用域名(CNAME)） 设置为根域和 `www` 子域。在本教程中，它们是 `example.com` 和 `www.example.com`。
**重要**  
在执行该步骤之前，请注意[使用备用域名的要求](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html#alternate-domain-names-requirements)，尤其是需要使用有效的 SSL/TLS 证书。

   1. 对于 **SSL 证书**，选择**自定义 SSL 证书 (example.com)**，然后选择涵盖域名和子域名的自定义证书。

      有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的 [SSL 证书](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesSSLCertificate)。

   1. 在 **Default Root Object (默认根对象)** 中，输入索引文档的名称，例如 `index.html`。

      如果用于访问分配的 URL 不包含文件名，CloudFront 分配将返回索引文档。**Default Root Object (默认根对象)** 应该与静态网站的索引文档的名称完全匹配。有关更多信息，请参阅 [配置索引文档](IndexDocumentSupport.md)。

   1. 将 **Logging (日志记录)** 设置为 **On (打开)**。
**重要**  
当您创建或更新分配并启用 CloudFront 日志记录时，CloudFront 会更新存储桶访问控制列表（ACL），以提供 `awslogsdelivery` 账户 `FULL_CONTROL` 权限，从而将日志写入您的存储桶。有关更多信息，请参阅 *Amazon CloudFront Developer Guide*（Amazon CloudFront 开发人员指南）中的 [Permissions required to configure standard logging and to access your log files](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#AccessLogsBucketAndFileOwnership)（配置标准日志和访问日志文件所需的权限）。如果存储日志的存储桶使用 S3 对象所有权的强制存储桶拥有者设置来禁用 ACL，则 CloudFront 无法将日志写入存储桶。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

   1. 对于 **Bucket for Logs**，选择您创建的日志记录存储桶。

      有关配置日志记录存储桶的更多信息，请参阅[（可选）记录 Web 流量](LoggingWebsiteTraffic.md)。

   1. 如果您要将由流量生成的日志存储到文件夹中的 CloudFront 分配，请在 **Log Prefix (日志前缀)** 中键入文件夹名称。

   1. 将所有其他设置保留为默认值。

1. 选择 **Create Distribution**。

1. 要查看分配的状态，请在控制台中找到该分配，然后检查 **Status** 列。

   `InProgress` (进行中) 状态表示分配尚未完成部署。

   分配部署完毕后，您可以使用新的 CloudFront 域名来引用您的内容。

1. 记录 CloudFront 控制台中显示的 **Domain Name (域名)** 值，例如 `dj4p1rv6mvubz.cloudfront.net`。

1. 要验证您的 CloudFront 分配是否正常运行，请在 Web 浏览器中输入该分配的域名。

   如果您的网站是可见的，则 CloudFront 分配正常工作。如果您的网站具有向 Amazon Route 53 注册的自定义域，您将需要 CloudFront 域名来在下一步更新记录集。

## 步骤 2：更新域和子域的记录集
<a name="update-record-sets"></a>

现在您已成功地创建 CloudFront 分配，请更新 Route 53 中的别名记录以指向新的 CloudFront 分配。

**更新别名记录以指向 CloudFront 分配**

1. 通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

1. 在左侧导航中，选择 **Hosted zones（托管区）**。

1. 在 **Hosted Zones（托管区）**页上，选择为您的子域创建的托管区域，例如 `www.example.com`。

1. 在 **Records（记录）**下，选择您为子域创建的 *A* 记录。

1. 在 **Record details（记录详细信息）**下，选择 **Edit record（编辑记录）**。

1. 在 **Route traffic to（将流量路由至）**下，选择 **Alias to CloudFront distribution（别名到 CloudFront 分配）**。

1. 在 **Choose distribution（选择分配）**下，选择 CloudFront 分配。

1. 选择 **Save**。

1. 要将根域的 *A* 记录重定向到 CloudFront 分配，请对根域重复此过程，例如 `example.com`。

   记录集的更新需要 2 – 48 小时才能生效。

1. 要查看新的 *A* 记录是否已生效，请在 Web 浏览器中输入您的子域 URL，例如 `http://www.example.com`。

   如果您的浏览器不再重定向至根域（例如，`http://example.com`），则说明新的 A 记录已生效。当新 *A* 记录生效时，由新 *A* 记录路由到 CloudFront 分配的流量不会重定向到根域。任何使用 `http://example.com` 或 `http://www.example.com` 引用站点的访问者都会重定向到最近的 CloudFront 边缘站点，在这里可体验更快速的下载。
**提示**  
浏览器可以缓存重定向设置。如果您认为新的 *A* 记录设置应该已经生效，但是您的浏览器仍然将 `http://www.example.com` 重定向至 `http://example.com`，请尝试清除浏览器的历史记录和缓存，然后关闭再重新打开浏览器应用程序，或使用其他 Web 浏览器。

## （可选）步骤 3：检查日志文件
<a name="check-log-files"></a>

访问日志会告诉您有多少人正在访问网站。它们还包含有价值的业务数据，您可以使用 [Amazon EMR](https://docs.amazonaws.cn/emr/latest/DeveloperGuide/) 等其他服务分析这些数据。

CloudFront 日志存储在您在创建 CloudFront 分配并启用日志记录时所选择的存储桶和文件夹中。CloudFront 将在相应请求提出后的 24 小时内将日志写入您的日志存储桶。

**查看网站的日志文件**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 为网站选择日志记录存储桶的名称。

1. 选择 CloudFront 日志文件夹。

1. 先下载由 CloudFront 编写的 `.gzip` 文件，然后再打开这些文件。

   如果您仅出于练习目的创建网站，则可以删除您所分配的资源，使其不再产生费用。为此，请参阅 [清理示例资源](getting-started-cleanup.md)。删除 Amazon 资源后，您的网站将不再可用。

# 清理示例资源
<a name="getting-started-cleanup"></a>

如果您出于学习目的创建静态网站，应删除您分配的 Amazon 资源，使其不再产生费用。删除 Amazon 资源后，您的网站将不再可用。

**Topics**
+ [步骤 1：删除 Amazon CloudFront 分配](#getting-started-cleanup-cloudfront)
+ [步骤 2：删除 Route 53 托管区域](#getting-started-cleanup-route53)
+ [步骤 3：禁用日志记录并删除 S3 存储桶](#getting-started-cleanup-s3)

## 步骤 1：删除 Amazon CloudFront 分配
<a name="getting-started-cleanup-cloudfront"></a>

在删除 Amazon CloudFront 分配之前，您必须先将其禁用。已禁用的分发不再起作用，并且不会产生费用。您可以随时启用已禁用的分发。已禁用的分发在删除后将不再可用。

**禁用并删除 CloudFront 分配**

1. 通过 打开 CloudFront 控制台[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)

1. 选择要禁用的分配，然后选择**禁用**。

1. 当系统提示确认时，选择**是，禁用**。

1. 选择禁用的分配，然后选择**删除**。

1. 当系统提示进行确认时，选择 **Yes, Delete**。

## 步骤 2：删除 Route 53 托管区域
<a name="getting-started-cleanup-route53"></a>

在删除托管区域之前，您必须先删除已创建的记录集。您不需要删除 NS 和 SOA 记录；删除托管区域时，会自动删除这些记录。

**删除记录集**

1. 通过以下网址打开 Route 53 控制台：[https://console.aws.amazon.com/route53/](https://console.amazonaws.cn/route53/)。

1.  在域名列表中，选择您的域名，然后选择 **Go to Record Sets**。

1. 在记录集列表中，选择您创建的 *A* 记录。

   每个记录集的类型均列在 **Type (类型)** 列中。

1. 选择 **Delete Record Set**。

1. 当系统提示进行确认时，选择 **Confirm**。

**删除 Route 53 托管区域**

1.  紧接上一个步骤，选择 **Back to Hosted Zones**。

1.  选择您的域名，然后选择 **Delete Hosted Zone**。

1.  当系统提示进行确认时，选择 **Confirm**。

## 步骤 3：禁用日志记录并删除 S3 存储桶
<a name="getting-started-cleanup-s3"></a>

在删除您的 S3 存储桶之前，请确保已禁用该存储桶的日志记录。否则，在您删除存储桶时，Amazon会继续将日志写入其中。

**禁用存储桶的日志记录**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在 **Buckets（存储桶）**下，选择存储桶名称，然后选择 **Properties（属性）**。

1. 从 **Properties** 中选择 **Logging**。

1. 取消选中**启用**复选框。

1. 选择**保存**。

现在您可以删除存储桶。有关更多信息，请参阅 [删除通用存储桶](delete-bucket.md)。

# 从 S3 通用存储桶将静态网站部署到 Amazon Amplify Hosting
<a name="website-hosting-amplify"></a>

我们建议您使用 [Amazon Amplify Hosting](https://docs.amazonaws.cn//amplify/latest/userguide/welcome.html.html) 来托管存储在 S3 上的静态网站内容。Amplify Hosting 是一项完全托管式服务，可让您轻松地在由 Amazon CloudFront 提供支持的全球可用内容分发网络（CDN）上部署您的网站，无需大量设置即可实现安全的静态网站托管。借助 Amazon Amplify Hosting，您可以选择对象在通用存储桶中的位置，将内容部署到托管式 CDN，并为网站生成一个公有 HTTPS URL 以供在任何地方访问。使用 Amplify Hosting 部署静态网站可为您提供以下优势和功能：
+ **部署到由 Amazon CloudFront 提供支持的 Amazon 内容分发网络（CDN）**：CloudFront 是一项 Web 服务，可以加快向用户分发静态和动态 Web 内容的速度。CloudFront 通过全球数据中心（称作边缘站点）网络传输内容。当用户请求您用 CloudFront 提供的内容时，请求被路由到提供最低延迟（时间延迟）的边缘站点，从而以最佳性能、更高的可靠性和可用性交付内容。有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的 [CloudFront 如何交付内容](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/HowCloudFrontWorks.html)。
+ **HTTPS 支持**：在您的网站和用户的 Web 浏览器之间提供安全的通信和数据传输。
+ **自定义域**：轻松将您的网站连接到从域注册商（如 Amazon Route 53）购买的自定义 URL。
+ **自定义 SSL 证书**：设置自定义域时，可以使用 Amplify 为您提供的默认托管证书，也可以使用从您选择的第三方证书颁发机构购买的您自己的自定义证书。
+ **内置指标和 CloudWatch 监控**：监控您网站的流量、错误、数据传输和延迟。
+ **密码保护**：通过在 Amplify 控制台中设置用户名和密码要求，限制对您网站的访问权限。
+ **重定向和重写**：在 Amplify 控制台中创建重定向和重写规则，以使 Web 服务器能够将导航从一个 URL 重新路由到另一个 URL。

当您将 Amazon S3 通用存储桶中存储的应用程序部署到 Amplify Hosting 时，Amazon 费用将基于 Amplify 定价模型确定。有关更多信息，请参阅 [Amazon Amplify 定价](https://www.amazonaws.cn/amplify/pricing/)。

**重要**  
Amplify Hosting 并非在提供 Amazon S3 的所有 Amazon Web Services 区域 均可用。若要将静态网站部署到 Amplify Hosting，包含您的网站的 Amazon S3 通用存储桶必须位于可以使用 Amplify 的区域之中。有关可以使用 Amplify 的区域列表，请参阅《Amazon Web Services 一般参考》**中的 [Amplify 端点](https://docs.amazonaws.cn/general/latest/gr/amplify.html#amplify_region)。

可以从 Amazon S3 控制台、Amplify 控制台、Amazon CLI 或 Amazon SDK 开始部署过程。您只能从位于您自己账户中的通用存储桶部署到 Amplify。Amplify 不支持跨账户 存储桶访问。

请按照以下说明，从 Amazon S3 控制台开始，将静态网站从 Amazon S3 通用存储桶部署到 Amplify Hosting。

## 从 S3 控制台将静态网站部署到 Amplify
<a name="DeployAmplify"></a>

**从 Amazon S3 控制台部署静态网站**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择包含您要部署到 Amplify Hosting 的网站的通用存储桶。

1. 选择**属性**选项卡。

1. 在**静态网站托管**下，选择**创建 Amplify 应用程序**。在此步骤中，部署过程将移至 Amplify 控制台。

1. 在**使用 S3 部署**页面上，执行以下步骤。

   1. 对于**应用程序名称**，输入应用程序或网站的名称。

   1. 对于**分支名称**，输入应用程序后端的名称。

   1. 对于**要托管的对象的 S3 位置**，请输入通用存储桶的目录路径，或选择**浏览 S3** 来定位和选择位置。

1. 选择**保存并部署**。

**注意**  
 如果您为 Amplify 上托管的通用存储桶中的静态网站更新了任何对象，则必须将应用程序重新部署到 Amplify Hosting，这样才能使更改生效。Amplify Hosting 不会自动检测对存储桶的更改。有关更多信息，请参阅《Amazon Amplify Hosting 用户指南》**中的 [Updating a static website deployed to Amplify from an S3 bucket](https://docs.amazonaws.cn//amplify/latest/userguide/update-website-deployed-from-s3.html)。

要直接从 Amplify 控制台开始，请参阅《Amazon Amplify Hosting 用户指南》**中的 [Deploying a static website from S3 using the Amplify console](https://docs.amazonaws.cn//amplify/latest/userguide/deploy--from-amplify-console.html)。

要开始使用 Amazon SDK，请参阅《Amazon Amplify Hosting 用户指南》**中的 [Creating a bucket policy to deploy a static website from S3 using the Amazon SDKs](https://docs.amazonaws.cn//amplify/latest/userguide/deploy-with-sdks.html)。