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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:57:12