为什么Laravel中无法在另一个API路由获取之前设置的session?
首先明确核心逻辑:Laravel 的 Session 依赖 Cookie 中的会话 ID 识别用户身份,默认 API 路由组不开启 Session 相关中间件,你已经手动添加了对应中间件,仍无法读取可按以下原因逐一排查:
常见原因及修复方案
请求未携带会话 Cookie
调用/order/add接口后,服务端会在响应头返回Set-Cookie字段,包含当前会话的唯一标识,后续所有请求必须携带该 Cookie 才能匹配到对应 Session。
测试场景(Postman/ApiFox):首次请求后手动复制响应的 Cookie 值,第二次请求时带入请求头即可。
前端对接场景:axios 需配置withCredentials: true,fetch 需配置credentials: 'include',同时跨域配置必须满足:Access-Control-Allow-Credentials = true,且Access-Control-Allow-Origin不能设置为通配符*,必须指定具体前端域名。Session 驱动配置错误
检查.env文件中的SESSION_DRIVER配置,禁止使用array驱动:array驱动仅在当前请求生命周期内有效,请求结束后数据就会销毁,跨请求自然无法读取。推荐使用file、redis、database等持久化驱动,修改配置后执行php artisan config:clear清除配置缓存生效。
若使用file驱动,需确认storage/framework/sessions目录有读写权限。会话 Cookie 配置不匹配
检查config/session.php中的相关配置:domain:若前后端使用不同子域名,需配置为顶级域名格式(如.example.com),保证跨子域名可以共享 Cookiesecure:若站点使用 HTTPS 协议,需设置SESSION_SECURE_COOKIE=true,HTTP 站点则设置为 false,否则 Cookie 不会被携带same_site:若存在跨站请求,可调整为lax或none(设置为 none 必须同时开启 secure 配置)
路由未生效中间件
执行命令php artisan route:list查看两个路由的中间件列表,确认EncryptCookies、StartSession中间件确实被加载,避免路由未归属到 api 中间件组导致配置不生效。
参考测试代码
你提供的路由代码本身没有语法问题,可直接用于测试:
// 设置Session路由 Route::post('/order/add', function () { session()->put('myVar', 'Amirmsj'); Log::info([ 'session' => session()->get('myVar'), ]); }); // 读取Session路由 Route::post('/order/edit', function () { Log::info([ 'session' => session()->get('myVar') ]); });
对应 kernel.php 中的中间件配置也符合要求:
'api' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class, 'throttle:api', ],
内容的提问来源于stack exchange,提问作者Amir.msj1374

