Laravel 5.5 中 Session 不会自动生效,必须启用 StartSession 中间件;路由未置于 web 中间件组、控制器构造函数中提前读取、file 驱动下未调用 save()、切换 Redis 驱动后未清理旧 session cookie,均会导致 Session 失效。

Session 在 Laravel 5.5 中不会自动生效,必须确保 StartSession 中间件已启用,否则所有 session() 或 $request->session() 操作都读不到数据、也存不进去。
路由没走 Web 中间件导致 Session 失效
这是最常见原因:你写的路由没被 web 中间件组包裹,StartSession 就根本没执行。
- 检查
routes/web.php—— 这里的路由默认已自动套上web中间件组,Session 可用 - 但如果你把路由写在
routes/api.php,它默认只走api中间件组,不含StartSession,Session 会完全不可用 - 临时解决:手动加中间件
middleware(['web']),例如Route::get('/test', ...)->middleware(['web']) - 长期建议:登录、用户态相关逻辑一律放在
web.php,别混进api.php
控制器构造函数里读不到 Session 数据
因为 StartSession 是中间件,在容器解析完控制器后才运行,而构造函数早在中间件之前就执行完了。
- 现象:
__construct()里调用session('key')或$this->request->session()->get('key')总是返回null - 正确做法:把 Session 读取逻辑移到具体方法里(如
index()、store()),或用闭包延迟执行 - 不要试图在构造函数里注入
Request并提前取 Session —— 它此时还没启动
使用 file 驱动时忘记调用 save() 导致写入丢失
file 驱动下,Laravel 默认延迟写入,仅在响应结束前统一落盘;但某些场景(比如重定向前手动修改又没触发自动保存)会导致数据“消失”。
- 典型场景:在 redirect 前调用
$request->session()->put('msg', 'ok'),但没跟$request->session()->save() - 解决:显式调用
save(),或改用更可靠的驱动(如redis) - 验证方式:查看
storage/framework/sessions/下是否有对应 session 文件生成并含预期内容 - 注意:
session(['key' => 'val'])全局函数调用后也会延迟写入,同样受此影响
切换 Redis 驱动后仍读不到旧 Session
Redis 和 file 是完全隔离的存储,切换驱动不会迁移已有数据,且 Session ID 生成逻辑也可能不同。
- 现象:改完
.env的SESSION_DRIVER=redis后,原来登录态全部失效 - 原因:旧 session 文件还在
storage/framework/sessions/,新请求却去 Redis 查,自然查不到 - 必须清空浏览器 cookie 中的
laravel_session,或让用户重新登录 - 确认 Redis 配置:检查
config/database.php中是否定义了session连接,并在config/session.php中设'connection' => 'session'
Session 不是 PHP 原生 $_SESSION,也不是“写了就立刻能读”的内存变量;它的生命周期由中间件控制,写入时机受驱动影响,跨请求一致性依赖正确配置和调用时机 —— 这些细节稍一疏忽,就会表现为“明明存了却读不到”。


















