如何使用redirect重定向到POST路由而非GET路由
Laravel 重定向到POST路由的解决方案
HTTP 标准下默认的302/303重定向会自动将请求方法转为GET,无法直接通过redirect()方法实现POST类型的重定向,以下是三种适配方案:
- 方案1:调整路由为GET类型(最适配你的业务场景,推荐)
你已经在resolve_booking方法中将paymode存入了session,目标路由不需要依赖POST参数传递,直接修改路由配置即可,原有控制器的redirect逻辑不需要做任何修改就能正常运行:
// web.php中把原来的Route::post改成Route::get Route::get('/payment_online',[App\Http\Controllers\MyMessengerController::class, 'payment_online'])->name('payment_online')->middleware('auth'); Route::get('/payment_delivery',[App\Http\Controllers\MyMessengerController::class, 'payment_delivery'])->name('payment_delivery')->middleware('auth');
- 方案2:返回自动提交的POST表单(必须保留POST路由时使用)
如果业务要求必须保留目标路由为POST类型,可以修改控制器逻辑,返回一个自带提交逻辑的视图:
控制器修改后代码:
public function resolve_booking(Request $request){ $request->session()->put('paymode',request('paymode')); $route = request('paymode') == 'Pay Online' ? 'payment_online' : 'payment_delivery'; // 传递目标路由到自动提交视图 return view('auto_post', ['target_route' => route($route)]); }
新建resources/views/auto_post.blade.php视图文件:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>跳转中...</title> </head> <body onload="document.getElementById('post_form').submit()"> <form id="post_form" method="POST" action="{{ $target_route }}"> @csrf <!-- 如果有其他需要传递的POST参数,可以在这里添加隐藏input --> </form> </body> </html>
- 方案3:使用307状态码保持请求方法(不推荐)
307临时重定向状态码会保留原请求的方法,你可以给重定向设置307状态码实现POST重定向:
return redirect()->route('payment_online')->setStatusCode(307);
注意该方案存在两个缺陷:一是仅当当前resolve_booking路由对应的原请求是POST类型时才生效;二是大部分浏览器会弹出表单重提交确认提示,用户体验较差。
内容的提问来源于stack exchange,提问作者Otis
相关产品推荐
相关产品推荐

