Laravel 5.4:多页面同URL提交表单后如何正确重定向回原页面
问题分析
你遇到的问题根源在于 Redirect::back() 的工作机制:它依赖浏览器发送的 HTTP_REFERER 头来确定跳转目标。当你从 test.blade.php 提交表单后,服务器直接返回了 test2.blade.php 的视图(没有做重定向),此时浏览器的 Referer 仍然是最初的 GET 请求 /test(也就是第一页)。所以当你在第二页提交表单失败后,back() 自然会跳回第一页。
解决方案
这里提供两种简单有效的修复方式,都能满足你保持同一 POST URL 的需求:
方法一:用会话记录当前步骤
在返回第二页视图时,把当前页面标识存入会话,验证失败时直接跳转到会话中记录的页面:
修改控制器代码
class TestController extends Controller { function post(Request $request){ if($request->has("test1")){ // 把当前步骤存入session session()->put('current_page', 'test2'); return view('/pages/test2'); }elseif($request->has("test2")){ // 从session获取要跳转的页面,默认回到第一页 $targetPage = session()->get('current_page', '/test'); return redirect($targetPage)->withErrors(["my error"]); }else{ return "unknown test"; } } }
方法二:在表单中添加当前页面标识
给第二页的表单加一个隐藏字段,明确告诉服务器当前是哪个页面,验证失败时直接跳转到该页面:
修改 test2.blade.php
{{ Form::open(['action' => ['TestController@post']]) }} test2 {{ Form::hidden('test2', "test2") }} {{-- 添加隐藏字段记录当前页面 --}} {{ Form::hidden('current_page', 'test2') }} {{ Form::submit('CONTINUE')}} {{ Form::close() }}
修改控制器代码
class TestController extends Controller { function post(Request $request){ if($request->has("test1")){ return view('/pages/test2'); }elseif($request->has("test2")){ // 获取表单里的当前页面标识,默认回到第一页 $currentPage = $request->input('current_page', 'test'); return redirect("/pages/{$currentPage}")->withErrors(["my error"]); }else{ return "unknown test"; } } }
补充说明
如果你后续还有更多步骤的表单,这两种方法都可以轻松扩展——只需在每个步骤的视图里更新会话记录或隐藏字段即可。相比 Redirect::back(),这种显式指定跳转目标的方式更可靠,不会受浏览器 Referer 头的限制。
内容的提问来源于stack exchange,提问作者MalcolmInTheCenter
相关产品推荐
相关产品推荐

