Laravel 7.4中redirect()->intended始终返回email/verify,登录跳转异常求助
Laravel 7.4 登录后重定向至来源页面问题解决
问题根源
你遇到的情况是intended()始终返回website.com/email/verify,最终跳转到HOME页面,核心原因是session中url.intended的值没有被正确清除。大概率是用户之前访问过需要邮箱验证的页面,EnsureEmailIsVerified中间件将当前请求地址存入了url.intended,即便用户已经完成邮箱验证,这个session值依然存在。登录后intended()读取到这个值,尝试跳转至/email/verify,但由于用户已验证,该页面会自动重定向到HOME,所以你看到的最终结果是HOME页面。
解决方案
1. 邮箱验证成功后清除session值
找到项目中的VerificationController,在verify方法(处理邮箱验证的逻辑)末尾添加清除url.intended的代码:
public function verify(Request $request) { // 原有验证逻辑... // 清除intended地址 session()->forget('url.intended'); return redirect()->route('home'); }
2. 在RedirectIfAuthenticated中过滤无效地址
修改RedirectIfAuthenticated文件,判断如果intended地址是邮箱验证页面,就替换为实际来源或HOME:
public function handle($request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { $intendedUrl = redirect()->intended(RouteServiceProvider::HOME)->getTargetUrl(); // 过滤邮箱验证页面 if (strpos($intendedUrl, '/email/verify') !== false) { // 优先取请求头中的来源地址,没有则用HOME $referer = $request->headers->get('referer'); return redirect($referer ?: RouteServiceProvider::HOME); } return redirect()->intended(RouteServiceProvider::HOME); } } return $next($request); }
3. 排查中间件配置
检查项目中是否有自定义中间件或全局中间件,错误地给已验证用户设置了url.intended值;同时确认EnsureEmailIsVerified中间件仅应用在需要邮箱验证的路由上,避免不必要的拦截。
排查步骤
- 在登录页面的控制器或视图中添加
dd(session('url.intended'));,登录前查看该值是否已经是/email/verify,确认session值的来源。 - 检查路由文件,确认
EnsureEmailIsVerified中间件的应用范围,避免覆盖不需要验证的路由。
内容的提问来源于stack exchange,提问作者Vedran Korponajic
相关产品推荐
相关产品推荐

