求助:DigitalOcean Functions设置CORS Headers后预检请求失败
DigitalOcean Functions CORS配置问题解决思路
问题背景
仅能在函数响应中设置CORS头,外部网站通过带Basic Authorization认证的POST请求调用函数时,响应头不生效,所有预检请求均失败,仅GET请求可正常工作。当前响应代码如下:
return { statusCode: 200, headers: { "Access-Control-Allow-Headers" : "Content-Type, Authorization", "Access-Control-Allow-Credentials" : true, "Access-Control-Allow-Methods": "OPTIONS,POST,GET", "Access-Control-Allow-Origin": "*" }, body: "Completed" };
核心原因
带自定义头(如Authorization)的POST请求属于非简单请求,浏览器会自动发起OPTIONS预检请求。而DigitalOcean Functions默认不会将OPTIONS请求转发到你的函数代码,导致你设置的CORS头无法返回,预检失败。另外,Access-Control-Allow-Credentials: true与Access-Control-Allow-Origin: "*"存在冲突,这是浏览器的安全限制,会直接导致CORS验证失败。
解决步骤
显式处理OPTIONS预检请求
在函数代码开头先判断请求方法,针对OPTIONS请求直接返回CORS头:// 处理OPTIONS预检请求 if (event.http.method === 'OPTIONS') { return { statusCode: 200, headers: { "Access-Control-Allow-Headers": "Content-Type, Authorization", "Access-Control-Allow-Credentials": true, "Access-Control-Allow-Methods": "OPTIONS,POST,GET", "Access-Control-Allow-Origin": "https://your-external-domain.com" // 替换为实际请求域名 }, body: "" }; } // 处理POST/GET业务逻辑 return { statusCode: 200, headers: { "Access-Control-Allow-Headers": "Content-Type, Authorization", "Access-Control-Allow-Credentials": true, "Access-Control-Allow-Methods": "OPTIONS,POST,GET", "Access-Control-Allow-Origin": "https://your-external-domain.com" // 替换为实际请求域名 }, body: "Completed" };修正Credentials与Origin的冲突
当启用Access-Control-Allow-Credentials: true时,必须将Access-Control-Allow-Origin设置为具体的请求域名,不能使用通配符*,否则浏览器会拒绝接受响应。
补充说明
DigitalOcean Functions目前不支持全局配置CORS,所有CORS相关的头必须在函数内部处理。GET请求属于简单请求,无需预检,所以能正常工作;而带自定义头的POST请求需要通过OPTIONS预检验证,因此必须显式处理OPTIONS请求。
内容的提问来源于stack exchange,提问作者Alun Lewis
相关产品推荐
相关产品推荐

