PHP + Nginx 反代 + 宝塔 是目前最稳、最省心、最少踩坑的跨域方案。
下面我直接给你一套 “照着做即可上线” 的方案,不讲空话。
一、最终推荐方案(一句话)
所有前端域名通过 Nginx 反向代理到同一个 PHP 后端,前端统一走 /api,彻底规避浏览器跨域
不需要 CORS
Cookie 天然共享登录态自动互通
最适合 CRMEB / 多后台系统
二、你的目标结构(标准)
| 系统 | 域名 | 部署 |
|---|---|---|
| 总后台 | www.crmeb.com | 前端静态 |
| 代理后台 | md.crmeb.com | 前端静态 |
| 供应商后台 | gys.crmeb.com | 前端静态 |
| PHP API | 127.0.0.1:9000 或 /www/server/php/xx | 同一套 |
API 不直接暴露给前端
三、宝塔里要做的 3 件事(顺序很重要)
第 1 步:宝塔新建 3 个站点(很重要)
宝塔 → 网站 → 新建站点
www.crmeb.com
md.crmeb.com
gys.crmeb.com
👉 每个站点都可以指向不同的前端目录
例如:
/www/wwwroot/www.crmeb.com
/www/wwwroot/md.crmeb.com
/www/wwwroot/gys.crmeb.com
第 2 步:统一 Nginx 反向代理 /api
在【每一个站点】的 Nginx 配置中加入
宝塔 → 网站 → 设置 → Nginx 配置
location /api/ {
proxy_pass http://127.0.0.1:9000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 关键:Cookie 主域共享
proxy_cookie_domain localhost .crmeb.com;
}
⚠️ 如果 PHP 是 Unix Socket,用下面的方式(推荐)
location /api/ {
fastcgi_pass unix:/tmp/php-cgi-80.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /www/wwwroot/api/public/index.php;
}
第 3 步:前端统一走 /api
错误写法(不要再这样)
axios.get('https://api.crmeb.com/admin/login')
正确写法(关键)
axios.defaults.withCredentials = true
axios.get('/api/admin/login')
浏览器视角:
md.crmeb.com/api/admin/login
Nginx 内部转发
PHP 后端
同源,不跨域
跨域问题直接消失
四、PHP 后端只需要 1 个配置(非常关键)
Cookie 共享主域
无论你是 ThinkPHP / Laravel / 原生 PHP:
setcookie(
'token',
$token,
time() + 86400,
'/',
'.crmeb.com',
true,
true
);
或 Laravel:
cookie(
'token',
$token,
1440,
'/',
'.crmeb.com',
true,
true,
false,
'None'
);
Cookie 必须满足:
| 属性 | 必须 |
|---|---|
| Domain | .crmeb.com |
| Path | / |
| Secure | ✔ |
| SameSite | None |
五、HTTPS(必做,否则 Cookie 会丢)
宝塔 → 网站 → SSL →
给 www / md / gys 全部开启 HTTPS
SameSite=None 必须 HTTPS
六、你这样部署后,会自动实现什么?
三个后台 互相免登录
登录一次,www / md / gys 都能用
不用写任何 CORS 代码
不用管 withCredentials 跨域问题
不怕浏览器升级限制
七、CRMEB 实战经验提醒(非常重要)
每个后台一个前端包
不要共用 build:
admin/
agent/
supplier/
后端用角色区分
admin_type = admin | agent | supplier
前端只控制展示
权限必须在后端兜底
八、如果你现在已经踩坑了(快速排查)
登录成功但跳回登录页?
Cookie Domain 没设 .crmeb.com
Network 有 200,但前端拿不到数据?
前端还在用 https://api.xxx.com
md / gys 请求 404?
Nginx /api/ proxy_pass 路径多了 /

