60

サイト全体は https 経由で提供されます。各ルートに「https」があります。ただし、http 経由で試みた場合、どうすれば https にリダイレクトできますか?

Route::group(array('https'), function()
{
     // all of our routes
}
4

15 に答える 15

8

フィルターの使用はLaravel 5.1.*で非推奨になりました。これは、ミドルウェアにとって完璧な仕事です。

ミドルウェアを作成し、ハンドル セクションに置きます

public function handle($request, Closure $next)
{
    if(! $request->secure()) {
        return redirect()->secure($request->path());
    }
    return $next($request);
}

次に、ミドルウェアを Kernel.php に登録し、ルートまたはコントローラーで使用します。

于 2016-02-07T14:05:51.920 に答える
5

以前の回答を組み合わせて 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');
于 2014-08-22T19:47:30.727 に答える
3

同じ URL にリダイレクトしたいが https を使用する場合は、Request::getRequestUri()代わりにRequest::path()次を使用する必要があります。

App::before(function($request)
{
    if( ! Request::secure())
    {
         return Redirect::secure(Request::getRequestUri());
    }
});
于 2015-09-02T15:24:56.200 に答える
1

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());
    }
});
于 2014-06-26T08:34:12.790 に答える
1

HTTP と HTTPS について詳しく理解していないので、この回答があまり良くない場合は申し訳ありません。

クライアントと (クライアントが指定した) サーバーが HTTPS を使用してRequest::secure()いる場合でも、アプリケーションが別のサーバーで実行されている可能性があり、https 要求を受信して​​いない可能性があるため、false を返す可能性があるという問題があることを理解しています。

私は自分のlaravelアプリをherokuでホストしていますが、そうしているようです。私の推測では、プライマリ (クライアント指定) サーバーはロード バランサーであり、リクエストが転送されると、通常の HTTP リクエストとして他のサーバーに到着します。

このような転送が発生する可能性がある場合は、単に をチェックしてはいけませRequest::secure()true。(#laravel @ irc.freenode.com の誰かから) にRequest::server('HTTP_X_FORWARDED_PROTO')等しいかどうかも確認するように指示されました'https'

したがって、ここの他のアドバイスに従い、安全でない場合にリダイレクトを実行する場合は、このサーバー パラメータもチェックしてみてください。

于 2014-08-26T22:06:44.527 に答える
0

プロキシの背後にあり、Request::secure() が機能していない場合。

App::before( function( $request )
{
  // set the current IP (REMOTE_ADDR) as a trusted proxy
  Request::setTrustedProxies( [ $request->getClientIp() ] );
});
于 2014-12-05T19:58:37.713 に答える
0

リダイレクトを処理するために 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
});
于 2016-05-10T03:25:39.910 に答える