Laravel 5.5 Web中间件下Session无法启动,Auth中间件正常
解决Laravel 5.5中Web中间件下Session无法启动的问题
从你提供的dd(session())输出能明确看到:Web中间件环境下Session的#started属性是false,而Auth中间件下Session正常启动。这基本可以锁定是中间件配置或执行顺序的问题,下面是具体的排查和解决步骤:
1. 检查Web中间件组是否包含StartSession
打开app/Http/Kernel.php文件,找到$middlewareGroups里的web组。Laravel 5.5的默认Web中间件组必须包含\Illuminate\Session\Middleware\StartSession::class——这是自动启动Session的核心中间件。
正确的Web组配置应该类似这样:
'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
如果你的Web组里缺少StartSession,直接添加上即可。
2. 确认StartSession的执行顺序
即使Web组里有StartSession,如果它的位置靠后(比如放在了依赖Session的中间件之后),也会导致Session无法及时启动。
- 确保
StartSession在AddQueuedCookiesToResponse之后(Session依赖Cookie存储ID) - 确保它在
ShareErrorsFromSession、自定义需要Session的中间件之前执行
3. 验证路由是否正确关联Web中间件
Laravel默认会给routes/web.php里的所有路由自动应用Web中间件组,但如果你的路由是放在routes/api.php里,或者自定义路由组没有指定web中间件,就会出现Session无法启动的情况。
- 把需要Session的路由移到
routes/web.php - 或者在自定义路由组里手动指定
web中间件:
Route::group(['middleware' => 'web'], function () { // 你的业务路由 });
4. 排查Session基础配置(可选)
虽然Auth下Session正常,说明驱动和权限大概率没问题,但可以快速确认:
- 检查
.env文件里的SESSION_DRIVER=file是否正确 - 确认
storage/framework/sessions目录的读写权限(服务器用户需要能读写这个目录)
临时应急方案(不推荐长期使用)
如果需要快速验证功能,可以在控制器方法或路由闭包里手动启动Session:
session()->start();
但这只是权宜之计,还是要修复中间件的配置问题才能彻底解决。
内容的提问来源于stack exchange,提问作者Sushil More
相关产品推荐
相关产品推荐

