You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

预检请求成功但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:47:02