API Gateway调用Lambda遇CORS错误,常规方案无效求解决
问题回顾
- 配置背景:API Gateway已启用CORS,集成响应映射了全量CORS头,Lambda响应也显式返回对应头,但调用仍触发CORS错误
- 两类错误提示:
...has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource....has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
- 前端调用逻辑:携带
Content-Type和X-Api-Key头的POST请求
解决思路
1. 修复OPTIONS方法核心配置
- 将OPTIONS方法的集成类型改为MOCK,无需绑定Lambda。预请求仅需API Gateway直接返回响应,无需执行业务逻辑
- 确认OPTIONS方法的方法响应已定义所有CORS头(如
Access-Control-Allow-Origin),且集成响应的映射值格式正确:字符串值必须用单引号包裹(如'*'),不能用双引号或无引号 - 关闭OPTIONS方法的「API Key Required」设置:浏览器预请求不会携带
X-Api-Key,强制要求会直接导致预请求失败
2. 修正Lambda响应的错误头字段
Access-Control-Allow-Credentials的有效值只能是true或false,不能设为*,否则浏览器会忽略该头导致校验失败。修改Lambda代码对应字段:'Access-Control-Allow-Credentials': true,- 若无需携带凭证(如Cookie),可直接移除该头,避免不必要的规则冲突
3. 确认API Gateway部署有效性
- 修改配置后必须重新部署到目标阶段,且确认部署的是最新配置
- 测试时使用浏览器无痕模式,避免缓存旧的响应头干扰结果
4. 手动验证预请求响应
用curl发送OPTIONS预请求,排查API Gateway的实际返回情况:
curl -X OPTIONS https://blah123.execute-api.us-east-2.amazonaws.com/blahblah1 \ -H "Origin: https://你的前端域名.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Content-Type,X-Api-Key" \ -v
重点检查:
- 响应状态码是否为200
- 响应头是否包含所有配置的CORS字段
Access-Control-Allow-Headers是否包含X-Api-Key和Content-Type
5. 保证ANY方法的头映射一致性
- 确保ANY方法的方法响应已定义所有CORS头,且集成响应的映射规则与OPTIONS方法完全一致
- Lambda返回的头名称需与API Gateway中
method.response.header.xxx的定义完全匹配(大小写敏感)
6. 排查网关错误响应的CORS配置
确认4xx/5xx默认网关响应已正确添加CORS头,避免因后端错误(如Lambda执行失败)导致浏览器无法获取真实错误信息,转而触发CORS错误
内容的提问来源于stack exchange,提问作者king_anton
相关产品推荐
相关产品推荐

