我在laravel中编写了本地化帮助程序,该程序检查URI中是否包含en
,fr
或其他本地语言。
如果没有提供语言环境,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'])
但这也不起作用。
答案 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保护,从安全的角度来看,这是绝对的优势。