

# 请求路由选择
<a name="UsingRouting"></a>

向使用 [CreateBucket](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateBucket.html) API 创建的存储桶发送请求且包含 [CreateBucketConfiguration](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CreateBucketConfiguration.html) 的程序必须支持重新导向。此外，不考虑 DNS TTL 的某些客户端可能会遇到问题。

本节描述了在设计要和 Amazon S3 结合使用的服务或应用程序时，应考虑的路由选择和 DNS 问题。

## 请求重定向和 REST API
<a name="Redirects"></a>

Amazon S3 使用域名系统 (DNS) 将请求路由到可以处理它们的设备。此系统处于有效的工作状态，但可能会发生临时路由错误。如果请求进入错误的 Amazon S3 位置，Amazon S3 将使用临时重定向进行响应，以告知请求者将请求重新发送到新的终端节点。如果请求的格式不正确，Amazon S3 将使用永久重定向来提供有关如何正确执行请求的说明。

**重要**  
要使用此功能，您必须拥有一个可以处理 Amazon S3 重定向响应的应用程序。唯一的例外是专用于处理存储桶（在不使用 `<CreateBucketConfiguration>` 的情况下创建）的应用程序。有关位置约束的更多信息，请参阅[访问和列出 Amazon S3 存储桶](https://docs.amazonaws.cn//AmazonS3/latest/userguide/access-bucket-intro.html)。  
对于在 2019 年 3 月 20 日发布的所有区域，如果请求到达错误的 Amazon S3 位置，则 Amazon S3 返回 HTTP 400 错误请求错误。  
有关启用或禁用 Amazon Web Services 区域的更多信息，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Web Services 区域 和端点](https://docs.amazonaws.cn/general/latest/gr/rande.html)。

**Topics**
+ [DNS 路由选择](#DNSRouting)
+ [临时请求重定向](#TemporaryRedirection)
+ [永久请求重定向](#RedirectsPermanentRedirection)
+ [请求重定向示例](#redirect-examples)

### DNS 路由选择
<a name="DNSRouting"></a>

DNS 路由选择会将请求路由到合适的 Amazon S3 设备。下面的图和过程显示 DNS 路由选择的示例。

![当 DNS 服务器将来自客户端的请求路由到设备 B 时发生的步骤。](http://docs.amazonaws.cn/AmazonS3/latest/developerguide/images/DNS_virthost.png)


**DNS 路由请求步骤**

1. 客户端创建 DNS 请求来获取存储在 Amazon S3 上的对象。

1. 客户端收到可以处理请求的设备的一个或多个 IP 地址。在本示例中，IP 地址用于设备 B。

1. 客户端创建面向 Amazon S3 设备 B 的请求。

1. 设备 B 将对象的副本返回给客户端。

### 临时请求重定向
<a name="TemporaryRedirection"></a>

临时重定向是一种错误响应类型，指示请求者应将请求重新发送到其他终端节点。由于 Amazon S3 的分布式特性，请求可能暂时会被路由到错误的设备。创建或删除存储桶后，很可能会立即发生此情况。

例如，如果您创建新的存储桶并立即向该存储桶发送请求，则根据存储桶的位置约束，您可能收到临时重定向。如果您在美国东部（弗吉尼亚北部）Amazon Web Services 区域 中创建了该存储桶，则看不到此重定向，因为这也是默认的 Amazon S3 终端节点。

但如果存储桶是在其他任何区域创建的，则对该存储桶的任何请求都会转到默认终端节点，同时会传播该存储桶的 DNS 条目。默认终端节点会将此请求重定向到具有 HTTP 302 响应的正确终端节点。临时重定向包含指向正确设备的 URI，您可以使用它来立即重新发送请求。

**重要**  
不要重复使用之前重定向响应提供的终端节点。它似乎能够正常工作（甚至可以持续很长一段时间），但它可能会产生不可预测的结果，且最终会在不另行通知的情况下导致失败。

下面的图和过程显示临时重定向的示例。

![当客户端向 B 发送请求但被重定向到 C 时发生的步骤。](http://docs.amazonaws.cn/AmazonS3/latest/developerguide/images/DNS_virthost_redirect.png)


**临时请求重定向步骤**

1. 客户端创建 DNS 请求来获取存储在 Amazon S3 上的对象。

1. 客户端收到可以处理请求的设备的一个或多个 IP 地址。

1. 客户端创建面向 Amazon S3 设备 B 的请求。

1. 设备 B 将返回一个重定向，指示可从位置 C 获取对象。

1. 客户端会将请求重新发送到设备 C。

1. 设备 C 将返回对象的副本。

### 永久请求重定向
<a name="RedirectsPermanentRedirection"></a>

永久重定向指示请求中资源的寻址不正确。例如，如果您使用路径类型请求来访问使用 `<CreateBucketConfiguration>` 创建的存储桶，将发生永久重定向。有关更多信息，请参阅[访问和列出 Amazon S3 存储桶](https://docs.amazonaws.cn//AmazonS3/latest/userguide/access-bucket-intro.html)。

为帮助您在开发期间查找这些错误，此类型的重定向不包含位置 HTTP 标头 (该标头允许您自动遵循请求，以定向到正确的位置)。参考生成的 XML 错误文档，获取有关使用正确的 Amazon S3 终端节点的帮助。

### 请求重定向示例
<a name="redirect-examples"></a>

以下是临时请求重定向响应的示例。

#### REST API 临时请求重定向
<a name="RedirectsTemporaryRedirection-response-rest-ex1"></a>

```
 1. HTTP/1.1 307 Temporary Redirect
 2. Location: http://awsexamplebucket1.s3-gztb4pa9sq.amazonaws.com/photos/puppy.jpg?rk=e2c69a31
 3. Content-Type: application/xml
 4. Transfer-Encoding: chunked
 5. Date: Fri, 12 Oct 2007 01:12:56 GMT
 6. Server: AmazonS3
 7. 
 8. <?xml version="1.0" encoding="UTF-8"?>
 9. <Error>
10.   <Code>TemporaryRedirect</Code>
11.   <Message>Please re-send this request to the specified temporary endpoint.
12.   Continue to use the original request endpoint for future requests.</Message>
13.   <Endpoint>awsexamplebucket1.s3-gztb4pa9sq.amazonaws.com</Endpoint>
14. </Error>
```

#### SOAP API 临时请求重定向
<a name="RedirectsTemporaryRedirection-respose-soap-ex2"></a>

**注意**  
 Amazon S3 的 SOAP API 不适用于新客户，并将于 2025 年 8 月 31 日接近使用寿命终止（EOL）。我们建议您使用 REST API 或 Amazon 开发工具包。

```
 1. <soapenv:Body>
 2.   <soapenv:Fault>
 3.     <Faultcode>soapenv:Client.TemporaryRedirect</Faultcode>
 4.     <Faultstring>Please re-send this request to the specified temporary endpoint.
 5.     Continue to use the original request endpoint for future requests.</Faultstring>
 6.     <Detail>
 7.       <Bucket>images</Bucket>
 8.       <Endpoint>s3-gztb4pa9sq.amazonaws.com</Endpoint>
 9.     </Detail>
10.   </soapenv:Fault>
11. </soapenv:Body>
```

## DNS 注意事项
<a name="DNSConsiderations"></a>

 Amazon S3 的设计要求之一是实现高可用性。为达到此要求，我们采取的一个方法是根据需要更新 DNS 中与 Amazon S3 终端节点相关联的 IP 地址。这些更改将自动在短期有效的客户端而不是某些长期有效的客户端中反映出来。长期有效的客户端将需要采取特殊的操作，定期重新解析 Amazon S3 终端节点，才能从这些更改中获益。有关虚拟机 (VM) 的更多信息，请参阅以下内容：
+  对于 Java，Sun 的 JVM 在默认情况下将永久缓存 DNS 查找结果；请参阅[ InetAddress 文档](https://docs.oracle.com/javase/9/docs/api/java/net/InetAddress.html)中的“InetAddress 缓存”一节，以了解有关如何更改此行为的信息。
+  对于 PHP，在最常见的部署配置中运行的永久性 PHP VM 将缓存 DNS 查找结果，直到 VM 重新启动。请参阅 [getHostByName PHP 文档](http://us2.php.net/manual/en/function.gethostbyname.php)。