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

AWS流式响应Lambda未为OPTIONS请求设置CORS头问题求助

解决AWS Lambda响应流(Function URL)的CORS问题

你的问题核心是浏览器发起的OPTIONS预请求未被正确处理:curl直接发送请求不会触发预请求,因此能正常获取CORS头;但浏览器会先发OPTIONS请求验证权限,而你的Lambda函数当前未处理该请求方法,导致响应缺失必要CORS头,引发错误。

以下是两种可行的解决方式:

1. 在Lambda函数内直接处理OPTIONS请求

Function URL会将所有请求方法(包括OPTIONS)转发到Lambda,因此可以在handler开头判断请求方法,单独处理OPTIONS请求并返回完整CORS头:

修改后的代码示例:

//@ts-ignore
exports.handler = awslambda.streamifyResponse(
  async (event: any, responseStream: any, context: any) => {
    const requestMethod = event.requestContext.http.method;

    // 处理OPTIONS预请求
    if (requestMethod === 'OPTIONS') {
      const corsHeaders = {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type',
        'Access-Control-Max-Age': '86400' // 缓存预请求结果24小时
      };
      //@ts-ignore
      const optionsResponseStream = awslambda.HttpResponseStream.from(
        responseStream,
        { statusCode: 200, headers: corsHeaders }
      );
      optionsResponseStream.end();
      return;
    }

    // 处理GET/POST等流式响应请求
    const httpResponseMetadata = {
      statusCode: 200,
      headers: {
        'Content-Type': 'text/html',
        'Access-Control-Allow-Origin': '*',
      },
    };

    //@ts-ignore
    responseStream = awslambda.HttpResponseStream.from(
      responseStream,
      httpResponseMetadata
    );

    responseStream.write('First line \n');
    await new Promise((resolve) => setTimeout(resolve, 500));
    responseStream.write('Second line \n');
    await new Promise((resolve) => setTimeout(resolve, 500));
    responseStream.write('Done!!!');
    responseStream.end();
  }
);

2. 用CloudFront作为Function URL的前置代理(可选)

若不想修改Lambda代码,可配置CloudFront分发指向你的Function URL,再在CloudFront中添加Lambda@Edge函数,在Origin Response或Viewer Response阶段注入CORS头、处理OPTIONS请求响应。这种方式配置稍复杂,适合需要统一管理多资源CORS策略的场景。

注意事项

  • 生产环境不要将Access-Control-Allow-Origin设为*,应指定具体前端域名以提升安全性。
  • Access-Control-Allow-Headers需包含前端实际发送的自定义请求头(如果有)。

内容的提问来源于stack exchange,提问作者c2tarun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:41:13