初めての 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 を使用している場合は、コントロール パネルに新しいページ ルールを追加することでこれを実現できます。
ベストアンサー1
ミドルウェア クラスを使用して動作させることができます。アイデアをお伝えしましょう。
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 にリダイレクトします。
- 現在のリクエストには安全なプロトコル (http) が使用されていません
- 環境が に等しい場合は
production
、好みに応じて設定を調整してください。
クラウドフレア
私はワイルドカード SSL を使用した本番環境でこのコードを使用していますが、コードは正常に動作します。&& App::environment() === 'production'
これを削除して localhost でテストすると、リダイレクトも動作します。したがって、SSL がインストールされているかどうかは問題ではありません。Https プロトコルにリダイレクトするには、Cloudflare レイヤーに細心の注意を払う必要があるようです。
編集 2015/03/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');
、実際にはリダイレクトされません。Webhttps://
サイトがレンダリングされると、リンクが構築されるだけです。