laravel登录后跳转首选redirect()->intended(),它读取session中预存的url.intended路径;若无记录则跳转fallback地址(如’/home’);需注意redirectifauthenticated中间件限制、post访问导致intended失效、登录失败时手动保留intended值,以及spa场景下应由前端控制跳转。

登录成功后跳转到上一页(intended 方法)
这是 laravel 最常用也最稳妥的跳转方式,适用于用户未登录时点击需权限的链接、被拦截到登录页,登录后自动回到原页面的场景。
关键在于 Auth::attempt() 成功后调用 redirect()->intended(),它会读取 session 中预存的 url.intended 路径。
常见错误现象:
– 用户从 /admin/posts/edit/5 进入登录页,登录后却跳回 /home
– 手动在登录表单里漏传 url.intended,或没调用 intended()
-
redirect()->intended('/home'):第二个参数是 fallback 路径,当没有上一页记录时才用 - 确保中间件
RedirectIfAuthenticated没有覆盖掉 intended 路径(它默认只存 GET 请求的前一页) - 如果登录页是通过 POST 直接访问(比如书签),
intended会失效,fallback 就很重要
自定义登录后跳转路径(修改 RedirectIfAuthenticated 或重写 redirectTo)
当业务要求所有登录都跳固定地址(比如后台统一进 /dashboard),不能依赖用户来路时,就得绕过 intended。
最直接的方式是重写控制器中的 redirectTo 属性或方法:
protected function redirectTo() { return auth()->user()->is_admin ? '/admin' : '/dashboard'; }
注意:redirectTo 是在认证成功后、响应发出前执行的,比 intended() 更早介入;但它不接收请求参数,逻辑受限。
- 不要在
redirectTo()里调用auth()->user()以外的 Eloquent 查询,容易引发 N+1 或事务问题 - 如果用了多守卫(如
api和web),每个守卫需单独配置redirectTo,否则可能跳错 - 别在中间件里硬写重定向,那会和控制器逻辑冲突,优先走控制器层控制
登录失败时保留原跳转目标(避免 intended 丢失)
用户输错密码后返回登录页,再试一次——这时如果没处理好,intended 就丢了,第二次登录成功也会跳错。
Laravel 默认在验证失败时清空 url.intended,所以得手动恢复。
- 在登录表单里加隐藏字段:
<input type="hidden" name="intended" value="{{ session('url.intended', url()->previous()) }}"> - 登录失败后,在控制器中重新写入:
session(['url.intended' => $request->input('intended') ?? url()->previous()]) - 别依赖
url()->previous()做 fallback,它可能返回登录页自身,造成死循环
SPA 场景下登录后跳转(Vue/React + Laravel API)
前后端分离时,intended 机制基本失效,因为前端路由不经过 Laravel 的 session 记录。
此时必须由前端决定跳哪,后端只返回状态和目标路径(或由前端传入)。
- 登录请求带上
redirect_to字段:POST /api/login?redirect_to=/settings/profile - 后端验证通过后,返回 json:
{"redirect_to": "/settings/profile", "Token": "..."} - 前端拿到后用 router.push() 跳转,而不是靠 Laravel 重定向
- 别让后端做 302 重定向,SPA 无法正确处理,只会丢掉 token 和 headers
真正麻烦的是权限校验后的二次跳转——比如用户有权限访问 /admin,但没登录,前端得先记下这个目标,登录后再触发,这部分逻辑完全脱离 Laravel 的 intended 体系。