[解決済み] Laravel 5 - HTTPSにリダイレクトする。
質問
最初の 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にリダイレクトする場合です。
- 現在のリクエストがセキュアなプロトコル(http)でない場合
-
もしあなたの環境が
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://
でリンクを構築するだけです。
関連
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み】Fatal error: mysqli_result 型のオブジェクトは使用できません [終了] 。
-
[解決済み] PHP product.php?id=1 のような URL を作成する方法
-
[解決済み] Laravelでカスタムヘルパー関数を作成する方法
-
[解決済み】Laravel: どのように現在のルート名を取得するには?(v5 ... v7)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】接続の取得に失敗しました: php_network_getaddresses: getaddrinfo failed: 名前またはサービスが不明
-
[解決済み】新しいPHPMailerはPHPMailerAutoload.phpが必要?
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】stdClassクラスのオブジェクトが文字列に変換されない。
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?