预检请求成功但GET请求返回200却报CORS错误(API网关+Lambda)
API网关+Lambda CORS问题排查方案
核心问题分析
预检OPTIONS请求通过,但后续GET请求报CORS错误,通常是因为实际GET请求的响应头不符合浏览器的CORS校验规则,要么和预检返回的规则不匹配,要么缺失必要的响应头。
具体排查步骤
1. 检查GET请求的响应头
打开浏览器开发者工具的网络面板,查看GET请求的响应头:
- 必须存在
Access-Control-Allow-Origin,且值要和请求的Origin完全一致(如果前端带了credentials,不能用*) - 如果请求中包含自定义请求头,必须返回
Access-Control-Allow-Headers,且包含对应的自定义头 - 如果需要携带cookie或认证信息,
Access-Control-Allow-Credentials必须设为true,且和预检响应一致
2. 核对API网关CORS配置
- 登录AWS控制台,进入API网关对应的资源,确认已启用CORS,并且在配置时勾选了
GET方法 - 如果是Lambda代理集成:API网关不会自动添加CORS头,必须由Lambda函数返回这些头
- 如果是非代理集成:需要在API网关的「集成响应」中配置响应头映射,将
Access-Control-*头映射到响应中
3. 修正Lambda函数的响应(代理集成场景)
如果用了Lambda代理集成,确保Lambda返回的响应包含完整的CORS头,示例代码:
# Python示例 def lambda_handler(event, context): return { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "https://your-frontend-domain.com", # 替换为实际前端域名 "Access-Control-Allow-Headers": "Content-Type,Authorization", # 按需添加自定义头 "Access-Control-Allow-Methods": "GET,OPTIONS" }, "body": json.dumps({"message": "success"}) }
注意:不要同时在API网关和Lambda中配置CORS头,避免冲突。
4. 清除缓存测试
- 浏览器可能缓存了旧的响应规则,用无痕模式重新请求
- 如果API网关启用了阶段缓存,进入对应阶段的缓存设置,手动刷新缓存
5. 自定义域名/CDN排查
如果使用了CloudFront或其他CDN:
- 确保CDN的缓存策略不会忽略
Access-Control-*响应头 - 在CDN的行为设置中,确认已配置正确的CORS规则
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

