针对 API Gateway 中的 REST API 的 CORS - Amazon API Gateway

针对 API Gateway 中的 REST API 的 CORS

跨源资源共享 (CORS) 是一项浏览器安全特征,该特征限制从在浏览器中运行的脚本启动的跨源 HTTP 请求。有关更多信息,请参阅什么是 CORS?

确定是否启用 CORS 支持

跨源 HTTP 请求将向以下项发出:

  • 一个不同的(例如,从 example.comamazondomains.com

  • 一个不同的子域(例如,从 example.competstore.example.com

  • 一个不同的端口(例如,从 example.comexample.com:10777

  • 一个不同的协议(例如,从 https://example.comhttp://example.com

如果您无法访问自己的 API 并收到包含 Cross-Origin Request Blocked 的错误消息,则可能需要启用 CORS。

跨源 HTTP 请求可分为两种类型:简单 请求和非简单 请求。

为简单请求启用 CORS

如果满足以下所有条件,则 HTTP 请求为简单 请求:

  • 其针对仅允许 GETHEADPOST 请求的 API 资源发出。

  • 如果它是一个 POST 方法请求,则它必须包含 Origin 标头。

  • 请求负载内容类型为 text/plainmultipart/form-dataapplication/x-www-form-urlencoded

  • 请求不包含自定义标头。

  • 简单请求的 Mozilla CORS 文档中列出的任何其他要求。

对于简单的跨源 POST 方法请求,来自资源的响应需要包含标头 Access-Control-Allow-Origin: '*'Access-Control-Allow-Origin:'origin'

所有其他跨源 HTTP 请求均为非简单 请求。

为非简单请求启用 CORS

如果 API 的资源收到非简单请求,则必须根据集成类型启用额外的 CORS 支持。

为非代理集成启用 CORS

对于这些集成,CORS 协议要求浏览器在发送实际请求之前向服务器发送一个预检请求,并等待来自服务器的批准(或对于凭证的请求)。您必须配置您的 API 以向预检请求发送适当的响应。

要创建预检响应,请执行以下操作:

  1. 使用模拟集成创建 OPTIONS 方法。

  2. 将以下响应标头添加到 200 方法响应中:

    • Access-Control-Allow-Headers

    • Access-Control-Allow-Methods

    • Access-Control-Allow-Origin

  3. 将集成传递行为设置为 NEVER。在这种情况下,将拒绝未映射内容类型的方法请求,并返回“HTTP 415 不支持的媒体类型”响应。有关更多信息,请参阅集成传递行为

  4. 输入响应标头的值。要允许所有来源、所有方法和通用标头,请使用以下标头值:

    • Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'

    • Access-Control-Allow-Methods: '*'

    • Access-Control-Allow-Origin: '*'

创建预检请求后,对于至少所有 200 响应,必须为所有启用 CORS 的方法返回 Access-Control-Allow-Origin: '*'Access-Control-Allow-Origin:'origin' 标头。

使用 AWS Management Console为非代理集成启用 CORS

您可以使用 AWS Management Console来启用 CORS。API Gateway 会创建 OPTIONS 方法,并尝试将 Access-Control-Allow-Origin 标头添加到现有的方法集成响应中。这并不总是有效,有时您需要手动修改集成响应,以便为至少所有 200 响应的所有启用 CORS 的方法返回 Access-Control-Allow-Origin 标头。

为代理集成启用 CORS 支持

对于 Lambda 代理集成或 HTTP 代理集成,您的后端负责返回 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 标头,因为代理集成不返回集成响应。

以下 Lambda 函数示例返回所需的 CORS 标头:

Node.js
export const handler = async (event) => { const response = { statusCode: 200, headers: { "Access-Control-Allow-Headers" : "Content-Type", "Access-Control-Allow-Origin": "https://www.example.com", "Access-Control-Allow-Methods": "OPTIONS,POST,GET" }, body: JSON.stringify('Hello from Lambda!'), }; return response; };
Python 3
import json def lambda_handler(event, context): return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': 'https://www.example.com', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' }, 'body': json.dumps('Hello from Lambda!') }