Actix-web配置CORS:如何允许多个域名访问API?
问题原因
Access-Control-Allow-Origin响应头不支持用逗号分隔多个域名。你之前的写法会让浏览器把整个字符串"https://domain1.com, https://domain2.com"当作单个域名去匹配,自然和两个实际请求的Origin都不匹配,导致跨域失败。
解决方案
要实现多域名跨域,有两种常用方式:
1. 动态匹配请求Origin(推荐生产环境使用)
先获取请求头里的Origin值,检查是否在允许的域名列表中,匹配成功就将Access-Control-Allow-Origin设为该Origin:
// 预先定义允许的域名列表 const ALLOWED_ORIGINS: &[&str] = &["https://domain1.com", "https://domain2.com"]; // 在请求处理逻辑中 let origin = request.headers() .get(header::ORIGIN) .and_then(|header_val| header_val.to_str().ok()); // 匹配允许的Origin,不匹配时可根据业务返回错误或空值 let allow_origin = origin.filter(|o| ALLOWED_ORIGINS.contains(o)) .unwrap_or_default(); return HttpResponse::Ok() .insert_header(header::ContentType::json()) .insert_header((header::ACCESS_CONTROL_ALLOW_ORIGIN, allow_origin)) // 如果你的接口需要携带凭证(如Cookie、HTTP认证信息),必须加上这个头 .insert_header((header::ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) .json(result);
2. 通配符(仅适用于无需凭证的场景)
如果不需要携带凭证,可直接设置Access-Control-Allow-Origin: *,但这种方式无法和凭证一起使用,且安全性较低,不推荐生产环境:
return HttpResponse::Ok() .insert_header(header::ContentType::json()) .insert_header((header::ACCESS_CONTROL_ALLOW_ORIGIN, "*")) .json(result);
额外注意
如果你的接口涉及非简单请求(如PUT/DELETE方法、自定义请求头),还需要处理OPTIONS预检请求,返回Access-Control-Allow-Methods、Access-Control-Allow-Headers等必要的CORS头,确保预检请求能正常通过。
内容的提问来源于stack exchange,提问作者xl x
相关产品推荐
相关产品推荐

