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

Laravel+React多子域独立会话配置问题求助

Laravel子域会话隔离解决方案

核心问题根源

当前SESSION_DOMAIN=.project.local的配置会让所有.project.local子域共享同一个会话Cookie,导致登录front.project.local:3000后,admin.project.local:3001自动复用该会话。后端仅生成1个会话文件正是因为所有请求携带的是同一个会话ID。

具体解决步骤

1. 修正环境变量配置

修改.env文件中的会话和Sanctum相关配置:

# 移除通配符域名,让会话Cookie仅绑定到后端域名
SESSION_DOMAIN=
# 修正STATEFUL_DOMAINS的错误格式,保留两个前端子域
SANCTUM_STATEFUL_DOMAINS="front.project.local:3000,admin.project.local:3001"
# 可选:设置默认前端会话Cookie名称
SESSION_COOKIE="front_session"

2. 创建自定义中间件隔离会话

通过中间件根据请求路径动态切换会话Cookie名称,实现两个前端应用的会话隔离:

  • 生成中间件:
    php artisan make:middleware SetSessionCookieName
    
  • 编辑app/Http/Middleware/SetSessionCookieName.php:
    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class SetSessionCookieName
    {
        public function handle(Request $request, Closure $next)
        {
            // 根据请求路径判断是前端还是管理端请求
            if ($request->is('api/admin/*')) {
                config(['session.cookie' => 'admin_session']);
            }
    
            return $next($request);
        }
    }
    
  • 在app/Http/Kernel.php的api中间件组中注册该中间件:
    protected $middlewareGroups = [
        'api' => [
            \App\Http\Middleware\SetSessionCookieName::class,
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];
    

3. 配置前端请求携带凭证

确保React前端在发送请求时携带Cookie凭证:

  • 若使用Axios,在全局配置中添加:
    import axios from 'axios';
    
    axios.defaults.baseURL = process.env.REACT_APP_BACKEND_URL;
    axios.defaults.withCredentials = true; // 关键配置
    
  • 若使用Fetch,每次请求添加credentials: 'include':
    fetch(`${process.env.REACT_APP_BACKEND_URL}/api/xxx`, {
        credentials: 'include',
        // 其他请求配置
    });
    

4. 清理旧Cookie

手动清除浏览器中与.project.local相关的Cookie,避免旧的共享Cookie干扰测试。

验证效果

完成配置后,分别登录两个前端应用,查看Laravel的storage/framework/sessions目录,会生成两个不同的会话文件,说明会话已实现隔离。

内容的提问来源于stack exchange,提问作者fdalex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:26:28