

# （可选）配置网页重定向
<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` 标头。