

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Cross-origin 资源共享支持和 Amazon EC2
<a name="cors-support"></a>

Amazon EC2 API 支持跨源资源共享 (CORS)。CORS 为加载到一个域中的客户端 Web 应用程序定义了一种与不同域中的资源进行交互的方式。有关更多信息，请访问[Cross-Origin 资源共享 W3C 建议](http://www.w3.org/TR/cors/)。借助对 Amazon EC2 的 CORS 支持，您可以构建使用亚马逊 EC2 API 的丰富客户端 Web 应用程序。例如，假设您正在托管一个网站`mywebsite.example.com`，并且您想在网页 JavaScript 上使用来向 Amazon EC2 API 发出请求。通常，浏览器会 JavaScript 阻止允许这些请求，但是使用 CORS，您可以从中进行跨源 Amazon EC2 API 调用。`mywebsite.example.com`

已为 Amazon EC2 API 启用了 CORS，可供您使用。您无需执行任何其他配置步骤即可开始使用此功能。您调用 Amazon EC2 API 的方式没有变化；他们仍必须使用有效的 AWS 证书进行签名，以确保 AWS 可以对请求者进行身份验证。有关更多信息，请参阅 I *AM 用户指南*中的[签署 AWS API 请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)。

在 Amazon EC2 API 中实现 CORS 是标准化的。您的应用程序可以向 Amazon EC2 API 发送简单请求，或者根据请求的内容，先发送预检请求，然后再发送实际请求。Amazon EC2 允许来自任何来源的请求

有关 CORS 的更多信息及其工作原理示例，请转到以下关于 Mozilla 开发者网络的文章：[HTTP 访问控制 (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS)。

## 简单请求
<a name="cors-simple"></a>

以下是定义简单请求或实际请求的标准：
+ 请求仅使用`GET`或 `POST` HTTP 方法。如果使用该`POST`方法，则`Content-Type`只能是以下方法之一：`application/x-www-form-urlencoded``multipart/form-data`、或`text/plain`。
+ 请求不设置自定义标头，例如`X-Other-Header`。

Amazon EC2 允许来自任何来源的请求。任何尝试通过将`Access-Control-Allow-Credentials`值设置为`true`（where`XMLHttpRequest.withCredentials = true`）来使用浏览器凭据的`GET`或`POST`请求都将失败。

以下信息描述了 Amazon EC2 的请求标头：

**简单的请求标头值**
+ `Origin`：指定想要访问资源的域（在本例中，资源为 Amazon EC2）。这是浏览器在跨域请求中插入的。

以下信息描述了 Amazon EC2 在简单请求或实际请求后返回（或未返回）的响应标头：

**简单的响应标头值**
+ `Access-Control-Allow-Origin`：指定可以访问资源的域（在本例中，资源为 Amazon EC2）。它总是以 \* 值返回。因此，Amazon EC2 允许任何跨域来源，并且从不允许浏览器凭证，例如 Cookie。
+ `Access-Control-Allow-Credentials`：表示浏览器凭据是否可用于发出实际请求。这永远不会被退回。因此，浏览器应将该值解释为`Access-Control-Allow-Credentials: false`。

## 飞行前申请
<a name="cors-preflight"></a>

如果您的请求内容符合以下标准，则会检查您的请求是否应发送实际请求。预检请求首先使用`OPTIONS`方法向资源（在本例中为 Amazon EC2）发送 HTTP 请求。

以下是定义预检请求的标准：
+ 请求使用`GET`或以外的 HTTP 方法`POST`。但是，如果使用该`POST`方法，则`Content-Type`不是以下方法之一：`application/x-www-form-urlencoded``multipart/form-data`、或`text/plain`。
+ 请求会设置自定义标头；例如`X-Other-Header`。

Amazon EC2 CORS 实现允许任何标头，并允许在实际请求中使用任何来源。

以下信息描述了向 Amazon EC2 发出的预检请求的请求标头：

**印前检查请求标头值**
+ `Origin`：指定想要访问资源的域（在本例中，资源为 Amazon EC2）。这是浏览器在跨域请求中插入的。
+ `Access-Control-Request-Method`：浏览器实际请求中要使用的 HTTP 方法。
+ `Access-Control-Request-Headers`：要在实际跨域请求中发送的自定义标头。

以下信息与 Amazon EC2 在预检请求后返回（或未返回）的响应标头有关：

**印前检查响应标头值**
+ `Access-Control-Allow-Origin`：指定可以访问资源的域（在本例中，资源为 Amazon EC2）。它总是以 \* 值返回。因此，Amazon EC2 允许任何跨域来源，并且从不允许浏览器凭证，例如 Cookie。
+ `Access-Control-Allow-Credentials`：表示浏览器凭据是否可用于发出实际请求。Amazon EC2 从来没有退回过这件商品。因此，浏览器应将该值解释为`Access-Control-Allow-Credentials: false`。
+ `Access-Control-Expose-Headers`：允许向浏览器公开标题。Amazon EC2 从来没有退回过这件商品。因此，请求的域无法读取来自 Amazon EC2 的返回标头。
+ `Access-Control-Max-Age`：指定可以将预检请求结果缓存多长时间。该值设置为 1800 秒（30 分钟）。
+ `Access-Control-Allow-Methods`：表示在发出实际请求时允许使用哪些方法。允许使用以下方法：`GET`、`POST``OPTIONS`、`DELETE`、和`PUT`。这还取决于您如何调用 Amazon EC2 API；例如，使用查询 API 或使用 REST。
+ `Access-Control-Allow-Headers`：表示可以在实际请求中使用哪些标头。Amazon EC2 接受预检请求中的任何标头。如果 HTTP 标头与实际请求无关，则会将其忽略。