当我尝试调用 Amazon API Gateway API 时,出现了“No 'Access-Control-Allow-Origin' header is present on the requested resource”错误。我想排除这个错误和 API Gateway 的其他 CORS 错误。
简短描述
当服务器未返回 CORS 标准要求的 HTTP 标头时,就会发生跨源资源共享(CORS)错误。要排除 API Gateway REST API 或 HTTP API 的 CORS 错误,必须重新配置 API,满足 CORS 标准要求。
**注意:**必须在资源级别配置 CORS。使用 API Gateway 配置或后端集成,例如 AWS Lambda。
解决方法
除了No 'Access-Control-Allow-Origin' header present CORS 错误外,您还可以按照以下步骤排除所有 CORS 错误。其他 CORS 错误包括 Method not supported under Access-Control-Allow-Methods header 和 No 'Access-Control-Allow-Headers' headers present。
以下原因都可能会导致 No 'Access-Control-Allow-Origin' header present 错误:
- 您没有为 API 配置返回所需 CORS 标头的 OPTIONS 方法。
- 您没有配置其他方法类型(例如 GET、PUT 或 POST),以返回所需的 CORS 标头。
- 您没有为 API 配置代理集成或非代理集成,以返回所需的 CORS 标头。
- 对于私有 REST API,会调用错误的调用 URL。或者,流量不会路由到接口虚拟私有云(VPC)端点。
确认导致出现错误的原因
请执行以下操作:
在失败的 API 资源上配置 CORS
对于 REST API
按照使用 API Gateway 控制台在资源上启用 CORS中的说明进行操作。
对于 HTTP API
按照为 HTTP API 配置 CORS中的说明进行操作。
在 API 资源上配置 CORS 时,请选择以下选项:
对于网关响应,选择默认 4XX 和默认 5XX。当您选择默认 4XX 和默认 5XX 时,即使请求未到达端点,API Gateway 也会使用所需的 CORS 标头进行响应。例如,如果请求包含不正确的资源路径,则 API Gateway 仍会以 403“Missing Authentication Token”错误进行响应。
对于 Access-Control-Allow-Methods,如果尚未选择选项,则选择该选项以及可用于 CORS 请求的所有其他方法,例如 GET、PUT 和 POST。API Gateway 控制台会为选项方法的 200 响应配置所需的 Access-Control-Allow 标头,并在重新配置的资源中覆盖现有值。
配置您的 REST API 集成会返回所需的 CORS 标头
要在其响应中返回所需的 CORS 标头,请配置您的后端 Lambda 函数或 HTTP 服务器。允许的域必须作为列表包含在Access-Control-Allow-Origin 标头值中。
对于代理集成,您无法在 API Gateway 中设置集成响应来修改 API 后端返回的响应参数。在代理集成中,API Gateway 将后端响应直接转发给客户端。
对于非代理集成,则必须在 API Gateway 中手动设置集成响应,才能返回所需的 CORS 标头。使用 API Gateway 控制台配置 CORS,因为控制台会自动将所需的 CORS 标头添加到配置的资源中。
(仅适用于私有 REST API)检查接口端点的私有 DNS 设置
对于私有 REST API,请确定是否在关联的接口 VPC 端点上激活了私有 DNS。
私有 DNS 已激活
使用私有 DNS 名称从您的 Amazon Virtual Private Cloud (Amazon VPC) 中调用您的私有 API。
私有 DNS 未激活
您必须手动将流量从调用 URL 路由到 VPC 端点的 IP 地址。使用以下调用 URL(Route53 别名):
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
**注意:**将 rest-api-id、region、vpce-id 和 stage 替换为您的 API 值。有关更多信息,请参阅如何调用私有 API。
如果私有 DNS 未激活,则您无法使用特定端点的公有 DNS 名称从 Amazon VPC 内访问您的私有 API。另外,不能使用 Host 标头选项,因为来自浏览器的请求不允许修改 Host 标头。
对于私有 API,不能使用 x-apigw-api-id 自定义标头,因为它会启动一个不包含标头的预检 OPTIONS 请求。使用 x-apigw-api-id 标头的 API 调用不会到达您的 API。
**注意:**确保在 API 的 OPTIONS 方法中关闭授权。
相关信息
测试 CORS
使用 API Gateway 导入 API 在资源上启用 CORS