

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

**Topics**
+ [重定向和 HTTP 用户代理](#RESTRedirectHTTPUserAgents)
+ [重定向和 100-Continue](#RESTRedirect100Continue)
+ [重定向示例](#RESTRedirectExample)

此部分介绍如何使用 Amazon S3 REST API 处理 HTTP 重定向。有关 Amazon S3 重定向的一般信息，请参阅《Amazon Simple Storage Service API 参考》中的[提出请求](MakingRequests.md)。

## 重定向和 HTTP 用户代理
<a name="RESTRedirectHTTPUserAgents"></a>

使用 Amazon S3 REST API 的程序既可以处理应用程序层上的重定向，也可以处理 HTTP 层上的重定向。许多 HTTP 客户端库和用户代理经过配置可以自动正确处理重定向；然而，许多其他 HTTP 客户端库和用户代理的重定向实施会不正确或不完整。

 在依赖库完成重定向要求之前，请测试以下案例：
+ 验证所有 HTTP 请求标头都已正确地包含在重定向的请求中 (收到重定向后的第二个请求)，包括诸如授权和日期等 HTTP 标准。
+ 验证诸如 PUT 和 DELETE 等非 GET 的重定向运行正常。
+ 验证大型 PUT 请求正确地遵循了重定向。
+ 如果需要很长时间才能收到 100-Continue 响应，请验证 PUT 请求正确地遵循了重定向。

 当 HTTP 请求方法不是 GET 或 HEAD 时，严格遵循 RFC 2616 的 HTTP 用户代理可能会在遵循重定向之前，请求显式确认。自动遵循 Amazon S3 生成的重定向通常是安全的，因为系统只会发出指向 amazonaws.com 域中主机的重定向，并且重定向请求的效果与原始请求的效果相同。

## 重定向和 100-Continue
<a name="RESTRedirect100Continue"></a>

要简化重定向处理过程、提高工作效率以及避免重复支付与发送重定向请求正文相关的费用，请将您的应用程序配置为对 PUT 操作使用 100-Continue。当应用程序使用 100-Continue 时，它不会发送请求正文，直到收到认可。如果根据标头拒绝了消息，则不会发送消息的正文。有关 100-Continue 的更多信息，请参阅 [RFC 2616 Section 8.2.3](http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3) 

**注意**  
根据 RFC 2616，在未知的 HTTP 服务器中使用 `Expect: Continue` 时，您应该直接发送请求正文，不要等待某个无限期的时段。这是因为某些 HTTP 服务器不能识别 100-Continue。但是，Amazon S3 能够识别您的请求是否包含了 `Expect: Continue`，并且将使用临时的 100-Continue 状态或最终的状态代码进行响应。此外，收到临时的 100 继续操作指示后，不会发生重定向错误。这可以帮助您避免在编写请求正文时，收到重定向响应。

## 重定向示例
<a name="RESTRedirectExample"></a>

本节提供了使用 HTTP 重定向和 100-Continue 执行客户端和服务器交互的示例。

下面是用于 `quotes.s3.amazonaws.com` 存储桶的示例 PUT。

```
1. PUT /nelson.txt HTTP/1.1
2. Host: quotes.s3.amazonaws.com
3. Date: Mon, 15 Oct 2007 22:18:46 +0000
4. 
5. Content-Length: 6
6. Expect: 100-continue
```

Amazon S3 将返回以下内容：

```
 1. HTTP/1.1 307 Temporary Redirect
 2. Location: http://quotes.s3-4c25d83b.amazonaws.com/nelson.txt?rk=8d47490b
 3. Content-Type: application/xml
 4. Transfer-Encoding: chunked
 5. Date: Mon, 15 Oct 2007 22:18:46 GMT
 6. 
 7. Server: AmazonS3
 8. 
 9. <?xml version="1.0" encoding="UTF-8"?>
10. <Error>
11.   <Code>TemporaryRedirect</Code>
12.   <Message>Please re-send this request to the
13.   specified temporary endpoint. Continue to use the
14.   original request endpoint for future requests.
15.   </Message>
16.   <Endpoint>quotes.s3-4c25d83b.amazonaws.com</Endpoint>
17.   <Bucket>quotes</Bucket>
18. </Error>
```

客户端将遵循重定向响应并向 `quotes.s3-4c25d83b.amazonaws.com` 临时终端节点发布新的请求。

```
1. PUT /nelson.txt?rk=8d47490b HTTP/1.1
2. Host: quotes.s3-4c25d83b.amazonaws.com
3. Date: Mon, 15 Oct 2007 22:18:46 +0000
4. 
5. Content-Length: 6
6. Expect: 100-continue
```

Amazon S3 将返回 100-Continue，以指示客户端应继续发送请求正文。

```
1. HTTP/1.1 100 Continue
```

客户端将发送请求正文。

```
1. ha ha\n
```

Amazon S3 将返回最终响应。

```
1. HTTP/1.1 200 OK
2. Date: Mon, 15 Oct 2007 22:18:48 GMT
3. 
4. ETag: "a2c8d6b872054293afd41061e93bc289"
5. Content-Length: 0
6. Server: AmazonS3
```