为 REST API 资源启用 CORS
跨源资源共享 (CORS)
确定是否启用 CORS 支持
跨源 HTTP 请求将向以下项发出:
-
一个不同的域(例如,从
example.com
到amazondomains.com
) -
一个不同的子域(例如,从
example.com
到petstore.example.com
) -
一个不同的端口(例如,从
example.com
到example.com:10777
) -
一个不同的协议(例如,从
https://example.com
到http://example.com
)
跨源 HTTP 请求可分为两种类型:简单 请求和非简单 请求。
如果满足以下所有条件,则 HTTP 请求为简单:
-
其针对仅允许
GET
、HEAD
和POST
请求的 API 资源发出。 -
如果它是一个
POST
方法请求,则它必须包含Origin
标头。 -
请求负载内容类型为
text/plain
、multipart/form-data
或application/x-www-form-urlencoded
。 -
请求不包含自定义标头。
-
简单请求的 Mozilla CORS 文档
中列出的任何其他要求。
对于简单跨源 POST
方法请求,来自您的资源的响应需要包含标头 Access-Control-Allow-Origin
,其中,标头键设置为 '*'
(任何源)或设置为允许访问该资源的源。
所有其他跨源 HTTP 请求均为非简单 请求。如果您的 API 的资源接收非简单请求,您将需要启用 CORS 支持。
启用 CORS 支持意味着什么
当浏览器接收非简单 HTTP 请求时,CORS 协议
-
包含一个
Origin
标头。 -
使用
OPTIONS
方法。 -
包含以下标头:
-
Access-Control-Request-Method
-
Access-Control-Request-Headers
-
因此,为了支持 CORS,REST API 资源需要实施一个 OPTIONS
方法,该方法可以响应 OPTIONS
预检请求,该请求至少具有由 Fetch 标准强制执行的以下响应标头:
-
Access-Control-Allow-Methods
-
Access-Control-Allow-Headers
-
Access-Control-Allow-Origin
启用 CORS 支持的方式取决于您的 API 的集成类型。
为模拟集成启用 CORS 支持
对于模拟集成,您可创建一个 OPTIONS
方法以将所需的响应标头(具有适当的静态值)作为方法响应标头返回,从而启用 CORS。此外,每个实际启用了 CORS 的方法还必须在至少其 200 响应中返回 Access-Control-Allow-Origin:'
标头,其中标头键的值设置为 request-originating
server addresses
''*'
(任何源)或设置为允许访问该资源的源。
为 Lambda 或 HTTP 非代理集成和Amazon服务集成启用 CORS 支持
对于 Lambda 自定义(非代理)集成、HTTP 自定义(非代理)集成或Amazon服务集成,您可以通过使用 API Gateway 方法响应和集成响应设置来设置所需的标头。当使用Amazon Web Services Management Console启用 CORS 时,API Gateway 会创建一个 OPTIONS
方法,并尝试将 Access-Control-Allow-Origin
标头添加到现有的方法集成响应中。这并不总是有用,有时您需要手动修改集成响应以正确启用 CORS。通常,这仅意味着手动修改集成响应将返回 Access-Control-Allow-Origin
标头。
为 Lambda 或 HTTP 代理集成启用 CORS 支持
对于 Lambda 代理集成或 HTTP 代理集成,您仍可以在 API Gateway 中设置所需的 OPTIONS
响应标头。然而,您的后端将负责返回 Access-Control-Allow-Origin
和 Access-Control-Allow-Headers
标头,因为代理集成不会返回集成响应。
以下示例 Lambda 函数返回所需的 CORS 标头: