laravel 通过 redirect()->intended() 实现登录后跳转原页面,需配合 auth 中间件保护路由、登录逻辑调用 intended() 方法及正常 session 驱动(非 array),缺一不可。

当用户未登录就访问需要认证的页面时,Laravel需先跳转到登录页,登录成功后再自动回到原来想访问的页面——redirect()->intended() 就是干这个事的,但它不是插上就能用,必须配合中间件、会话和重定向流程一起工作。
确保使用 auth 中间件保护目标路由
在 routes/web.php 中,给需要登录后才能访问的路由加上 auth 中间件。例如:Route::get('/dashboard', [DashboardController::class, 'index'])->middleware('auth');
不加这个中间件,Laravel 不知道该把用户“原路返回”,也不会自动把当前 URL 存进 session。
登录逻辑里必须调用 intended() 方法
在登录成功后的控制器方法(如 LoginController@authenticate 或自定义登录逻辑)中,不能写 return redirect()->route('home'); 这类固定跳转。
必须改用:return redirect()->intended('/home');
【/home 是兜底路径,当 session 里没有存目标 URL 时才生效】。如果用户是直接打开登录页再登录的,session 里没存来源,就会跳到这里。
检查 session 驱动是否正常启用
打开 config/session.php,确认 'driver' => env('SESSION_DRIVER', 'file') 已配置且实际生效。
若用的是 database 驱动,确保 sessions 表已迁移:php artisan session:table && php artisan migrate。
若驱动为 array(常见于测试环境),intended() 会失效——因为 array 驱动不持久化 session 数据,跳转前存的 URL 到登录后就丢了。
手动触发 intended 的两种典型场景
方法一:从守卫主动中断并保存目标地址
在控制器里写:if (!Auth::check()) { session(['url.intended' => url()->full()]); return redirect()->route('login'); }
这等价于 auth 中间件做的事,适合自定义拦截逻辑。
方法二:登录表单提交前隐藏域补位
在 login.blade.php 的 form 里加:<input type="hidden" name="redirect_to" value="{{ session('url.intended', '/') }}">
然后在登录逻辑里读取该值并手动重定向——但这绕过了 intended(),不推荐,仅作兼容备用。
验证 intended 是否生效的三步检查法
第一步:打开浏览器无痕窗口,访问 /admin/users(需 auth 中间件保护的路由);
第二步:观察地址栏是否跳转为 /login?redirect_to=%2Fadmin%2Fusers(或类似带 query 的登录页);
第三步:输入正确账号密码登录,确认最终跳转到了 /admin/users 而不是首页。
如果第三步失败,重点查 session 配置和中间件是否漏挂;如果第二步没出现 redirect_to 参数,说明中间件根本没触发重定向,要检查路由分组或中间件注册顺序。











