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
相关产品推荐
相关产品推荐

