Fedora Linux下Laravel 'Session store not set on request'错误排查与解决
解决Laravel中'Session store not set on request'问题的排查方案
1. 确认请求经过会话中间件
Laravel的会话功能依赖web中间件组(包含StartSession核心中间件),需确保目标路由已纳入该中间件覆盖范围:
routes/web.php中的路由默认自动应用web中间件;若使用routes/api.php,需手动为需要会话的路由添加web中间件,示例:Route::middleware('web')->group(function () { Route::get('/api/needs-session', [YourController::class, 'targetMethod']); });- 也可在控制器构造函数中指定中间件:
public function __construct() { $this->middleware('web'); }
2. 检查中间件执行顺序
会话中间件必须在依赖会话的中间件(如Authenticate)之前运行,打开app/Http/Kernel.php,确认web中间件组中StartSession的位置:
protected $middlewareGroups = [ 'web' => [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Auth\Middleware\Authenticate::class, // 其他中间件... ], ];
确保\Illuminate\Session\Middleware\StartSession::class排在所有需要访问会话的中间件之前。
3. 验证会话存储目录权限
尽管你确认会话文件已生成,仍需验证目录权限是否符合服务器运行要求:
- 运行服务器的用户(如
www-data、nginx)需拥有storage/framework/sessions目录的读写权限; - 执行命令调整权限:
chown -R www-data:www-data storage/framework/sessions chmod -R 755 storage/framework/sessions
4. 排查自定义代码的干扰
服务提供者
避免在服务提供者的register或boot方法中提前访问会话(此时会话尚未初始化),比如不要在服务提供者中调用session()辅助函数或request()->session()。
自定义中间件
排查所有自定义中间件,确认没有在StartSession执行前尝试访问会话的逻辑,例如:
// 错误示例:会话未启动时访问会话 public function handle(Request $request, Closure $next) { if ($request->session()->has('user_id')) { // ... } return $next($request); }
此类代码需调整到会话中间件之后执行。
5. 验证会话配置加载
- 执行
php artisan config:clear清除配置缓存; - 添加测试路由验证配置是否正确加载:
Route::get('/test-session', function (Request $request) { // 打印会话配置,确认与.env设置一致 dd(config('session')); // 尝试读写会话 $request->session()->put('test_key', 'hello_session'); return $request->session()->get('test_key'); })->middleware('web');
访问该路由,确认配置正常且能完成会话读写操作。
6. 排查核心文件修改
若你曾修改过Laravel核心的会话相关文件(如Illuminate\Session\Middleware\StartSession),建议恢复原版文件,避免因自定义修改导致逻辑错误。
内容的提问来源于stack exchange,提问作者M3nnoun
相关产品推荐
相关产品推荐

