为何AWS Lambda函数URL的预检请求未返回CORS响应头?
问题分析与解决方案
问题根源
你遇到的CORS错误核心原因有三点:
- 带凭证的CORS请求禁止通配符源:你的Lambda函数URL配置了
Allow Origin: *,但浏览器发送的IAM签名请求属于「带凭证的跨域请求」,根据CORS规范,这种场景下不能使用*作为允许的源,必须指定具体的前端域名。 - 默认CORS配置未覆盖签名相关头:请求包含
authorization、x-amz-date等自定义签名头,但默认CORS配置未明确允许这些头,导致预检请求验证失败。 - 未启用凭证允许选项:带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
相关产品推荐
相关产品推荐

