AWS Lambda+API Gateway配置CORS后仍遭浏览器跨域拦截问题
问题描述
我已按照AWS官方文档通过API Gateway为AWS Lambda配置了CORS支持,并用官方测试方法验证API,测试成功且显示access-control-allow-origin已启用(见截图)。但通过JavaScript发起请求时,浏览器提示:
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
附上JS请求代码及Lambda函数截图,请问问题出在哪里?
排查与解决建议
- 先确认API是否重新部署:在控制台配置完CORS后,必须重新部署API到对应的阶段,否则新的CORS设置不会生效,浏览器请求的还是旧配置的API。这是最常见的疏忽点。
- 检查Lambda的响应头:如果API Gateway用的是Lambda代理集成模式,控制台的CORS配置不会生效,必须让Lambda自己返回
Access-Control-Allow-Origin头。比如Lambda返回结构要包含headers字段:
就算不是代理集成,Lambda返回的头也可能覆盖API Gateway的配置,所以要确保Lambda没返回冲突的头。{ "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*" // 或者指定你的前端域名,比如"https://your-frontend.com" }, "body": JSON.stringify("请求成功") } - 验证OPTIONS方法配置:浏览器发起跨域请求前会先发OPTIONS预检请求,你要确认API Gateway的OPTIONS方法已经正确配置了CORS规则,包括允许的origin、方法、请求头。如果只给GET/POST配置了CORS,没处理OPTIONS,预检失败就会触发这个错误。
- 清空浏览器缓存测试:浏览器可能缓存了旧的API响应头,导致新配置不生效。试试用隐私模式打开页面,或者手动清空缓存后再测试。
- 核对请求地址与CORS配置的origin:确保JS请求的API地址和你配置CORS时允许的origin完全匹配,比如前端域名是
https://abc.com,你配置的是http://abc.com,或者端口不一致,都会导致origin不匹配,浏览器拒绝请求。
内容的提问来源于stack exchange,提问作者Tennis Smith
相关产品推荐
相关产品推荐

