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

为何AWS Lambda函数URL的预检请求未返回CORS响应头?

问题分析与解决方案

问题根源

你遇到的CORS错误核心原因有三点:

  1. 带凭证的CORS请求禁止通配符源:你的Lambda函数URL配置了Allow Origin: *,但浏览器发送的IAM签名请求属于「带凭证的跨域请求」,根据CORS规范,这种场景下不能使用*作为允许的源,必须指定具体的前端域名。
  2. 默认CORS配置未覆盖签名相关头:请求包含authorization、x-amz-date等自定义签名头,但默认CORS配置未明确允许这些头,导致预检请求验证失败。
  3. 未启用凭证允许选项:带IAM签名的请求需要浏览器传递凭证信息,必须在CORS配置中明确开启Allow Credentials。

解决方案

1. 更新Lambda函数URL的CORS配置

登录AWS控制台,找到目标Lambda函数,进入「配置」→「函数URL」→「编辑CORS」,设置以下参数:

  • 允许的来源:填写前端实际域名,比如http://localhost:3000(不能再用*)
  • 允许的方法:添加OPTIONS和POST
  • 允许的头:添加预检请求中列出的所有头:authorization、content-type、x-amz-content-sha256、x-amz-date、x-amz-security-token
  • 允许凭证:勾选「启用」选项

2. 调整前端fetch请求

在fetch调用中添加credentials: 'include',明确告知浏览器在跨域请求中发送凭证信息:

const result = await fetch(rawUrl, { 
  headers, 
  body, 
  method,
  credentials: 'include' // 新增此行
})

3. 验证预检请求

修改完成后,重新触发前端请求,检查预检OPTIONS响应是否包含以下头:

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: authorization,content-type,x-amz-content-sha256,x-amz-date,x-amz-security-token
Access-Control-Allow-Credentials: true

为什么终端请求能成功?

终端发送请求不受浏览器跨域安全策略限制,不会触发CORS预检,也不需要验证响应中的CORS头,因此可以直接成功执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:50:25