You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,可以把原始路由直接通过验证表单传递:

  1. 在2FA中间件里,把当前请求的路由信息存到请求属性里:
// 2FA中间件代码
$originalRoute = $request->fullUrl();
$request->attributes->set('original_route', $originalRoute);

// 然后跳转到2FA验证页面,比如:
return view('2fa.verify', ['originalRoute' => $originalRoute]);
  1. 在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>
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:01:06