这是一个典型的多子域后台 + 前端分离部署的跨域问题,你这个场景我直接按 可落地方案给你讲,不绕概念。
你的目标是:
| 系统 | 访问域名 |
|---|---|
| 总后台 | www.crmeb.com |
| 代理后台 | md.crmeb.com |
| 供应商后台 | gys.crmeb.com |
| API 接口 | 同一套后端 |
一、核心结论(先给答案)
最推荐方案:所有前端子域 + API 统一为 *.crmeb.com,后端开启「子域级 CORS + 共享 Cookie」
这样可以:
- 各后台 独立部署
- 登录态 可共享
- 不受浏览器 SameSite 限制
- 不需要 iframe / token hack
二、正确的整体架构(重要)
www.crmeb.com → 总后台前端
md.crmeb.com → 代理后台前端
gys.crmeb.com → 供应商后台前端
api.crmeb.com → 后端 API(统一)
建议:API 单独一个子域
三、跨域的本质问题有哪些?
你实际会遇到 3 个问题:
- 浏览器跨域请求被拦
- Cookie 不共享 / 登录态丢失
- Axios 携带凭证失败
我们逐个解决。
四、后端必须做的事情(最关键)
CORS 配置(允许子域访问)
错误写法(千万别)
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
正确写法(动态 Origin)
允许 *.crmeb.com
Java / Spring Boot 示例
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns(
"https://www.crmeb.com",
"https://md.crmeb.com",
"https://gys.crmeb.com"
)
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true);
}
⚠️ Spring Boot 2.4+ 要用 allowedOriginPatterns
PHP / Laravel(中间件)
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
$allow = [
'https://www.crmeb.com',
'https://md.crmeb.com',
'https://gys.crmeb.com',
];
if (in_array($origin, $allow)) {
header("Access-Control-Allow-Origin: $origin");
header("Access-Control-Allow-Credentials: true");
}
Cookie 设置为「主域共享」
这是 能否多后台免登录的核心
Set-Cookie: token=xxx;
Domain=.crmeb.com;
Path=/;
SameSite=None;
Secure;
HttpOnly;
关键点解释:
| 属性 | 必须 |
|---|---|
| Domain=.crmeb.com | ⭐ 否则子域不共享 |
| SameSite=None | ⭐ 跨子域请求 |
| Secure | ⭐ 浏览器强制 |
| HttpOnly | 建议 |
五、前端必须做的事情
Axios / fetch 必须带凭证
axios.defaults.withCredentials = true
或单独配置:
axios({
url: 'https://api.crmeb.com/admin/user/info',
withCredentials: true
})
API 地址统一
不要写相对路径
// ❌ 错误
axios.get('/admin/user/info')
// ✅ 正确
axios.get('https://api.crmeb.com/admin/user/info')
六、Nginx 层推荐做法(非常实用)
API 统一反向代理(可选但强烈推荐)
server {
server_name www.crmeb.com md.crmeb.com gys.crmeb.com;
location /api/ {
proxy_pass https://api.crmeb.com/;
proxy_set_header Host api.crmeb.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这样前端可以:
axios.get('/api/admin/user/info', { withCredentials: true })
浏览器视角:
同源访问,不存在跨域
这是生产环境最稳方案

