全部
常见问题
产品动态
精选推荐
功能建议

分析中 已回复 待规划 {{opt.name}}
分析中 已回复 待规划
多门店版本独立部署一个站点,如何处理刷新跨域问题

管理 管理 编辑 删除

这是一个典型的多子域后台 + 前端分离部署的跨域问题,你这个场景我直接按 可落地方案给你讲,不绕概念。

你的目标是:

系统访问域名
总后台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 个问题:

  1. 浏览器跨域请求被拦
  2. Cookie 不共享 / 登录态丢失
  3. 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 })

浏览器视角:

同源访问,不存在跨域

这是生产环境最稳方案


{{voteData.voteSum}} 人已参与
支持
反对
请登录后查看

小码二开 最后编辑于2025-12-15 08:23:56

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}} 【已收集】
{{item.floor}}# 沙发 板凳 地板 {{item.floor}}# 【已收集】
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打赏
已打赏¥{{item.reward_price}}
{{item.like_count}}
分享
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打赏
已打赏¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
收起 展开更多
查看更多
打赏
已打赏¥{{reward_price}}
64
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定
打赏金额
当前余额:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
请输入 0.1-{{reward_max_price}} 范围内的数值
打赏成功
¥{{price}}
完成 确认打赏

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服