AWS API Gateway首次调用成功后Access-Control-Allow-Origin头丢失排查
AWS API Gateway 首次调用正常、第二次调用触发CORS错误问题
我使用AWS API Gateway搭建了API,首次调用可以成功,但第二次调用时会触发CORS报错:
从源'http://localhost:3000'发起的对'url'的XMLHttpRequest请求已被CORS策略阻止:请求资源上不存在'Access-Control-Allow-Origin'标头。
首次调用的响应头中存在access-control-allow-origin: *,但第二次调用时该标头消失,原因不明。
相关请求信息
成功调用响应
- 成功预检请求:

- 成功XHR请求:

失败调用响应
- 失败XHR请求:

- 失败预检请求:

两次调用间隔极短,失败的XHR响应中明确缺少access-control-allow-origin标头。
现有配置与代码
前端调用代码
$.ajax({ url: `url`, method: 'GET', contentType: 'application/json', error: function (xhr) { if (xhr.status === 504) { modelApi() $('.overlayMessage').text('Server not responding, trying your search again. Please do not refresh the page') } if (xhr.status === 502) { $('#overlay').fadeOut() alert('No data was returned for your current search criteria. Please try selecting a different meter or date range') } } })
API Gateway CORS配置
已通过控制台开启CORS,配置如下:
Lambda响应代码
已按官方文档要求在Lambda中设置响应头:
def get_model_lambda_handler(event,context): try: kwargs = event['params']['querystring'] body = model.OLSRegression(**kwargs,download_data=True).run(preprocess=True) body = json.dumps(body,ignore_nan=True,cls=NumpyEncoder) response = { 'statusCode': 200, 'body': body, 'headers': { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS,GET', 'Content-Type': 'application/json', }, } return response
问题排查建议
- 优先检查Lambda运行日志,确认第二次调用是否抛出未捕获异常:当前Lambda仅在try块内返回带CORS头的响应,一旦代码执行出错、没有被捕获,Lambda会返回默认错误响应,默认响应不携带自定义CORS头,直接触发报错。可以给Lambda增加全局异常捕获逻辑,所有返回场景包括错误场景都统一带上Access-Control相关响应头。
- 检查API Gateway缓存配置:如果开启了响应缓存且没有配置缓存CORS头,可能会命中不带CORS头的错误缓存响应,可临时关闭缓存验证问题是否复现。
- 检查网关自定义错误配置:如果第二次调用返回的是502/504这类网关错误,响应是API Gateway直接返回的,没有走到Lambda层,不会携带Lambda配置的CORS头。可以在API Gateway中配置网关错误自定义响应,给所有网关错误统一添加CORS相关头。
- 检查预检缓存配置:如果浏览器缓存了OPTIONS预检结果,第二次请求头与第一次不一致时可能跳过预检直接发请求,此时后端返回错误就会直接触发CORS报错。可以在CORS配置中将
Access-Control-Max-Age设为0,临时禁用预检缓存测试。 - 核对CORS允许头配置:确认第二次请求是否携带了额外的自定义头,比如Authorization等,检查这些头是否已经添加到
Access-Control-Allow-Headers配置列表中。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

