サイト全体は https 経由で提供されます。各ルートに「https」があります。ただし、http 経由で試みた場合、どうすれば https にリダイレクトできますか?
Route::group(array('https'), function()
{
// all of our routes
}
サイト全体は https 経由で提供されます。各ルートに「https」があります。ただし、http 経由で試みた場合、どうすれば https にリダイレクトできますか?
Route::group(array('https'), function()
{
// all of our routes
}
フィルターの使用はLaravel 5.1.*で非推奨になりました。これは、ミドルウェアにとって完璧な仕事です。
ミドルウェアを作成し、ハンドル セクションに置きます
public function handle($request, Closure $next)
{
if(! $request->secure()) {
return redirect()->secure($request->path());
}
return $next($request);
}
次に、ミドルウェアを Kernel.php に登録し、ルートまたはコントローラーで使用します。
以前の回答を組み合わせて Laravel 4.2 に更新する:
Route::filter('secure', function () {
if (! Request::secure()) {
return Redirect::secure(
Request::path(),
in_array(Request::getMethod(), ['POST', 'PUT', 'DELETE']) ? 307 : 302
);
}
});
Route::when('*', 'secure');
同じ URL にリダイレクトしたいが https を使用する場合は、Request::getRequestUri()
代わりにRequest::path()
次を使用する必要があります。
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::getRequestUri());
}
});
Request::secure()
URL が であっても何らかの理由で false を返す問題がある場合はhttps
、$_SERVER['HTTPS'] 値が存在しないことが原因である可能性があります。
これは回避策です:
App::before(function ($request){
// Force https
if(!Request::secure() && array_get($_SERVER, 'SERVER_PORT') != 443){
return Redirect::secure(Request::path());
}
});
HTTP と HTTPS について詳しく理解していないので、この回答があまり良くない場合は申し訳ありません。
クライアントと (クライアントが指定した) サーバーが HTTPS を使用してRequest::secure()
いる場合でも、アプリケーションが別のサーバーで実行されている可能性があり、https 要求を受信していない可能性があるため、false を返す可能性があるという問題があることを理解しています。
私は自分のlaravelアプリをherokuでホストしていますが、そうしているようです。私の推測では、プライマリ (クライアント指定) サーバーはロード バランサーであり、リクエストが転送されると、通常の HTTP リクエストとして他のサーバーに到着します。
このような転送が発生する可能性がある場合は、単に をチェックしてはいけませRequest::secure()
んtrue
。(#laravel @ irc.freenode.com の誰かから) にRequest::server('HTTP_X_FORWARDED_PROTO')
等しいかどうかも確認するように指示されました'https'
。
したがって、ここの他のアドバイスに従い、安全でない場合にリダイレクトを実行する場合は、このサーバー パラメータもチェックしてみてください。
プロキシの背後にあり、Request::secure() が機能していない場合。
App::before( function( $request )
{
// set the current IP (REMOTE_ADDR) as a trusted proxy
Request::setTrustedProxies( [ $request->getClientIp() ] );
});
リダイレクトを処理するために Laravel 4 自体を使用する必要がある場合 (私のように)、次のセットアップを行います (コード内のコメントとしての説明)。
ルート フィルター:
// app/filters.php
Route::filter('ssl.force', function()
{
if(App::environment('production') && !Request::secure())
{
// don't set a session cookie when redirecting to another scheme to
// avoid dropping the session when switching scheme
Config::set('session.driver', 'array');
// preserve query string while redirecting by using fullUrl()
// instead of Redirect::secure + Request::path()
$url = str_replace('http://', 'https://', Request::fullUrl());
return Redirect::to($url, 302, array(), true);
}
// secure cookies for https
Config::set('session.secure', Request::secure());
});
次に、フィルタをルートまたはルート グループにフィルタ前として適用します。例えば:
// app/routes.php
Route::group(array('before' => 'ssl.force'), function () {
// SSL routes
});