在重定向时保留http方法

时间:2018-09-18 06:51:20

标签: php laravel localization

我在中编写了本地化帮助程序,该程序检查URI中是否包含enfr或其他本地语言。 如果没有提供语言环境,config("app.locale")应该放在原始URI的前面,并且应该重定向到这个新URI。即/user也应重定向/en/user

我目前正在尝试使用以下方法解决此问题:

public function handle($request, Closure $next, $guard = null)
{
    $langSegment = $request->segment(1);

    // if first segment is language parameter then go on
    if (strlen($langSegment) == 2 && ($langSegment == 'en' || $langSegment == 'fr')) {
        App::setLocale($langSegment);
        return $next($request);
    } else {
        $newURL=url(config("app.locale") . "/" . implode("/",$request->segments()));       
        return redirect($newURL);
    }

}

这对于大多数请求都适用,除非方法为POST并且未设置$language。在这种情况下,用户将被重定向,但方法将更改为POST请求。

我还尝试将重定向更改为

return redirect()->route('routeName', $request->all(), 302, ['method','POST'])

但这也不起作用。

1 个答案:

答案 0 :(得分:1)

所以我对HTTP status code 307做了一些测试。

让我首先描述一下我的测试设置,我创建了以下路线:

Route::get("/help", 'HelpController@index');
Route::post("/post", 'HelpController@post');
Route::post("/redirected", 'HelpController@redirected');

HelpController包含以下代码:

<?php

namespace App\Http\Controllers;

class HelpController extends Controller
{
    public function index(){
        return view('help');
    }

    public function post(){
        return redirect('/redirected', 307);
    }

    public function redirected(){
        echo "Success";
    }
}

help.blade.php是非常基本的形式,即:

<form method="post" action="/post">
    @csrf
    <button>Go</button>
</form>

我很高兴地报告 307返回码确实成功保留了POST方法。

即当我转到/help网址并按“开始”按钮时,看到的是“成功”消息,如预期的那样。

您可能会问这对我意味着什么?

我们可以通过一个非常简单的更改来解决您的问题:

return redirect($newURL);

成为

return redirect($newURL, 307);

最后难道不是那么容易吗?

此外,正如您在我的测试设置中所看到的那样,这也保留了crsf保护,从安全的角度来看,这是绝对的优势。