Laravel表单提交后如何将请求转发至原定路由
嘿,这个场景我之前做项目时也遇到过,Laravel确实有几个比手动存Session更简洁的方案,给你梳理下:
方案1:用Laravel原生的
intended()方法 这应该是最省心的方案了,Laravel其实内置了处理“跳转回用户原本意图访问页面”的逻辑。
在你的2FA验证通过后,别直接硬编码跳转到/home,改用这个:
return redirect()->intended('/home');
intended()方法会自动读取Session里url.intended的值(这个值Laravel默认会帮你记录,只要你的2FA中间件是在web中间件组之后运行——也就是已经启用了Session)。如果这个值不存在,才会 fallback到你传的/home。
要是你的2FA中间件没有自动触发这个记录逻辑,也可以在中间件里手动加一行:
// 在2FA中间件拦截请求、跳转到验证页之前 session()->put('url.intended', $request->fullUrl());
方案2:通过表单隐藏字段传递原始路由
如果你不想依赖Session,可以把原始路由直接通过验证表单传递:
- 在2FA中间件里,把当前请求的路由信息存到请求属性里:
// 2FA中间件代码 $originalRoute = $request->fullUrl(); $request->attributes->set('original_route', $originalRoute); // 然后跳转到2FA验证页面,比如: return view('2fa.verify', ['originalRoute' => $originalRoute]);
- 在2FA验证页面的表单里,加一个隐藏输入框:
<form method="POST" action="/2fa/verify"> @csrf <input type="text" name="code" placeholder="输入验证码"> <!-- 隐藏字段传递原始路由 --> <input type="hidden" name="original_route" value="{{ $originalRoute }}"> <button type="submit">验证</button> </form>
- 在2FA验证路由里,拿到这个值后直接跳转:
public function verify(Request $request) { // 验证验证码逻辑... $originalRoute = $request->input('original_route', '/home'); return redirect()->to($originalRoute); }
方案3:用
url()->previous()(谨慎使用) 这个方法是获取上一个请求的URL,也就是用户被拦截前访问的/user/password/reset。验证通过后可以这么写:
return redirect()->to(url()->previous());
但要注意:如果用户在2FA验证页面刷新了,previous()就会变成验证页面本身,这时候跳转就会出错,所以这个方案只适合用户不会刷新验证页的场景,可靠性不如前两个。
如果需要更具体的代码示例(比如中间件的完整逻辑),可以随时提出来~
内容的提问来源于stack exchange,提问作者flip
相关产品推荐
相关产品推荐

