S3托管网站通过API Gateway访问Lambda报CORS错误无法解决
核心问题原因梳理
你遇到的跨域报错和S3存储桶的CORS配置无关,该报错是浏览器请求API Gateway域名时,响应头未返回Access-Control-Allow-Origin导致的,常见诱因有以下几种:
未正确处理OPTIONS预检请求
浏览器发送POST请求前会先发送OPTIONS预检请求,如果你仅为POST/GET方法配置了集成,未给OPTIONS方法配置正确的响应头,预检请求会直接失败,返回的默认响应不带CORS头。你需要确认API Gateway的OPTIONS方法已配置为返回200状态码,且响应头包含Access-Control-Allow-Origin: *以及对应的允许方法、允许头配置。API Gateway配置修改后未重新部署
在API Gateway控制台修改CORS配置、方法配置后,必须手动将修改部署到对应的Stage,否则配置不会生效。修改完后进入「Stages」页面选择你使用的环境,点击「Deploy API」重新部署后再测试。Lambda返回格式不符合代理集成要求
如果你用的是Lambda代理集成,返回结构必须严格符合要求,示例正确格式如下:return { statusCode: 200, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' }, body: JSON.stringify(yourResponseData) }如果你漏写了
statusCode、把headers放在了body内部,或者返回格式错误,API Gateway会返回默认错误响应,不带自定义的CORS头。Lambda执行出错返回错误响应
如果Lambda运行时报错(比如无DynamoDB访问权限、代码执行异常),返回的错误响应默认不带你配置的CORS头,浏览器会优先报跨域错误而不是实际的接口错误。你可以先用curl命令直接调用API Gateway接口,检查返回状态码和响应头:curl -v https://你的API地址.execute-api.eu-west-3.amazonaws.com/default/你的函数名如果curl调用返回非200状态码,先排查Lambda的执行错误,修复后再验证跨域问题。
内容的提问来源于stack exchange,提问作者Fly

