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

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请求:
    失败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,配置如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:27:04