如何排查 API Gateway API 中的 CORS 错误?

上次更新日期:2021 年 1 月 27 日

当我尝试调用我的 Amazon API Gateway API 时,我收到错误消息“No 'Access-Control-Allow-Origin' header is present on the requested resource”。如何排查此错误?

简短描述

如果服务器不返回 CORS 标准所要求的 HTTP 标头,就会出现跨源资源共享 (CORS ) 错误。要解决来自 API Gateway REST APIHTTP API 的 CORS 错误,请重新配置 API 以满足 CORS 标准。

有关为 REST API 启用 CORS 的更多信息,请参阅为 REST API 资源启用 CORS。对于 HTTP API,则请参阅为 HTTP API 配置 CORS

注意:CORS 必须在资源级别启用,并且可以使用 API Gateway 配置或后端集成(例如 AWS Lambda)进行处理。

解决方法

以下示例说明如何排查 No ‘Access-Control-Allow-Origin’ header present 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 方法。
  • 另一种方法类型(如 GETPUTPOST)未配置为返回所需的 CORS 标头。
  • 具有代理集成非代理集成的 API 未配置为返回所需的 CORS 标头。
  • 对于私有 REST API,调用的调用 URL 不正确,或者流量没有路由到接口 Virtual Private Cloud (VPC) 终端节点。

确认引起错误的原因

有两种方法可以确认 API Gateway 中的 CORS 错误的原因:

  • 在调用 API 时,创建 HTTP 存档 (HAR) 文件。然后,通过检查 API 响应中返回的参数中的标头来确认文件中错误的原因。
  • 使用浏览器中的开发人员工具检查失败 API 请求的请求和响应参数。

对遇到错误的 API 资源启用 CORS

对于 REST API,请参阅使用 API Gateway 控制台对资源启用 CORS。对于 HTTP API,则请参阅为 HTTP API 配置 CORS

重要提示:如果您为 HTTP API 配置 CORS,则 API Gateway 会自动发送对启动前 OPTIONS 请求的响应,即使没有为 API 配置 OPTIONS 路由也是如此。对于 CORS 请求,API Gateway 会将配置的 CORS 标头添加到集成的响应中。

启用 CORS 时,请确保执行以下操作:

  • 对于 Gateway Responses for <api-name> API (<api-name> API 的网关响应),选择 DEFAULT 4XXDEFAULT 5XX 复选框。

注意:选择这些默认选项后,API Gateway 会使用所需的 CORS 标头进行响应,即使请求未到达终端节点也是如此。例如,如果请求包含不正确的资源路径,API Gateway 仍会作出响应,显示 403 "Missing Authentication Token" 错误

  • 对于 Methods (方法),如果尚未选中 OPTIONS 方法,请选中该方法的复选框。此外,选中 CORS 请求可用的所有其他方法的复选框。例如:GETPUTPOST

注意:如果在 API Gateway 控制台中启用 CORS,则会向资源添加 OPTIONS 方法(如果尚不存在)。它还使用所需的 Access-Control-Allow-* 标头配置 OPTIONS 方法的 200 响应。如果您已使用控制台启用 CORS,则再次启用 CORS 将覆盖现有值。

配置 REST API 集成以返回所需的 CORS 标头

将后端 AWS Lambda 函数HTTP 服务器配置为在响应中发送所需的 CORS 标头。要返回 Access-Control-Allow-Origin 中的域列表,您必须将后端配置为将列表中的域名作为标头 Access-Control-Allow-Origin 的值发送。

重要提示:如果您使用代理集成,则无法在 API Gateway 中设置集成响应来修改 API 后端返回的响应参数。在代理集成中,API Gateway 会将后端响应直接转发给客户端。

如果您使用非代理集成,请在 API Gateway 中手动设置集成响应以返回所需的 CORS 标头。

注意:对于具有非代理集成的 API,使用 API Gateway 控制台对资源启用 CORS 会自动将所需的 CORS 标头添加到资源中。

检查接口终端节点的私有 DNS 设置(仅适用于私有 REST API)

对于私有 REST API,确定是否为关联的接口 VPC 终端节点启用了私有 DNS

如果为接口终端节点启用了私有 DNS,请使用私有 DNS 名称从 Amazon Virtual Private Cloud (Amazon VPC) 中调用您的私有 API,以避免 CORS 错误。

如果未启用私有 DNS,请手动将流量从调用 URL 路由到 VPC 终端节点的 IP 地址。

注意:无论是否启用私有 DNS,都可以使用以下调用 URL:https://api-id.execute-api.region.amazonaws.com/stage-name。 确保将 api-idregionstage-name 的值替换为 API 所需的值。 

有关更多信息,请参阅如何调用私有 API

重要提示:如果在未启用私有 DNS 的情况下启用了 CORS,请记住以下限制条件:

  • 您不得使用特定于终端节点的公有 DNS 名称从 Amazon VPC 中访问您的私有 API。
  • 您不能使用主机标头选项,因为来自浏览器的请求不允许主机标头操作。
  • 您不能使用 x-apigw-api-id 自定义标头,因为它会触发不包含标头的启动前 OPTIONS 请求。使用 x-apigw-api-id 标头的 API 调用将无法到达您的 API。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?