1. ホーム
  2. php

[解決済み] Laravel 5 - HTTPSにリダイレクトする。

2022-05-14 20:01:28

質問

最初の Laravel 5 プロジェクトで作業していますが、アプリで HTTPS を強制するロジックをどこに、どのように配置すればよいかわかりません。ここでの決め手は、アプリを指すドメインが多数あり、3 つのうち 2 つだけが SSL を使用していることです (3 つ目はフォールバック ドメインです。長い話です)。ですから、私はこれを.htaccessではなく、アプリのロジックで処理したいと思います。

Laravel 4.2 では、次のコードでリダイレクトを実現しました。 filters.php :

App::before(function($request)
{
    if( ! Request::secure())
    {
        return Redirect::secure(Request::path());
    }
});

ミドルウェアはこのようなものを実装する場所だと思うのですが、それを使ってもなかなか理解できません。

ありがとうございます。

アップデイト

私のようにCloudflareを使用している場合、コントロールパネルで新しいページルールを追加することで実現できます。

どのように解決するのですか?

ミドルウェアのクラスで動作させることができます。その方法を紹介します。

namespace MyApp\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
            if (!$request->secure() && App::environment() === 'production') {
                return redirect()->secure($request->getRequestUri());
            }

            return $next($request); 
    }
}

次に、このミドルウェアをすべてのリクエストに適用し、ルールを Kernel.php ファイルにルールを追加します。

protected $middleware = [
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',

    // appending custom middleware 
    'MyApp\Http\Middleware\HttpsProtocol'       

];

上記のサンプルでは、ミドルウェアがすべてのリクエストをhttpsにリダイレクトする場合です。

  1. 現在のリクエストがセキュアなプロトコル(http)でない場合
  2. もしあなたの環境が production . ということで、お好みに応じて設定を調整してください。

クラウドフレア

このコードを本番環境で WildCard SSL を使用していますが、コードは正しく動作しています。もし私が && App::environment() === 'production' を削除し、localhostでテストすると、リダイレクトも動作します。ですから、SSLがインストールされているかどうかは問題ではありません。Httpsプロトコルにリダイレクトされるためには、Cloudflareレイヤーに非常に厳しい注意を払う必要があるようです。

2015年3月23日編集

ありがとうございます。 @Adam Link の提案に感謝します: それはおそらく、Cloudflareが渡しているヘッダが原因です。CloudFlareはHTTP経由でサーバーをヒットし、HTTPSリクエストを転送することを宣言するX-Forwarded-Protoヘッダを渡すと思われます。ミドルウェアに次のような行を追加する必要があります...

$request->setTrustedProxies( [ $request->getClientIp() ] ); 

...CloudFlareが送信しているヘッダを信頼するようにします。これにより、リダイレクトのループを止めることができます

2016/09/27を編集 - Laravel v5.3

ミドルウェアのクラスを web グループに追加します。 kernel.php file :

protected $middlewareGroups = [
    'web' => [
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,

        // here
        \MyApp\Http\Middleware\HttpsProtocol::class

    ],
];

覚えておいてください web グループは、デフォルトですべてのルートに適用されます。 web を明示的に設定する必要はありません。

2018/08/23編集 - Laravel v5.7に対応しました。

  • 環境に応じてリクエストをリダイレクトするには App::environment() === 'production' . 以前のバージョンでは env('APP_ENV') === 'production' .
  • 使用方法 \URL::forceScheme('https'); はリダイレクトを行ないません。それは単に https:// でリンクを構築するだけです。