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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:43