LaravelでHTTPS対応する正しいやり方

正しいやり方

  1. HTTPSを強制する場合はWebサーバ側で対処する。HTTPから強制リダイレクトしてもいいし、HTTPは閉じてしまってもいい。
  2. HTTPSを強制する場合、もしくはHTTPSをデフォルトにしたい場合はAPP_URLhttps://...にする。
  3. リバースプロキシ下で動かす場合、HTTPSでのアクセスか正しく判別できるようTrustProxiesを設定する。

これだけでいい。

間違ったやり方

よく以下のような方法を見かけるが、これらは必要ない。

  • Laravel側でHTTPSでのアクセスか判別する。
  • Laravel側でhttps://...にリダイレクトする。
  • URL::forceScheme()secure_url(), secure_asset()でURLを強制的にhttps://...にする。

なぜ上記のやり方をする必要がないのか

Laravelは基本的には自動で、リクエストを見てHTTPSでのアクセスか判別し、出力するURLを調整している。

artisanコマンドからの実行などリクエストがない場合は、APP_URLを見てHTTPSにするか決めている。

リバースプロキシ下でHTTPSでのアクセスかの判別が難しい場合は、TrustProxiesで対応できるようになっている。

そのため上記の方法でわざわざアプリケーションをHTTPSでだけ動作するよう強制する必要はない。

じっさい上記の方法を使うと、開発環境で動かすような場合に不便になり、その回避のためにリダイレクトやURL::forceScheme()をproductionでだけ動かすようにするなど追加の変更が必要になってしまう。secure_url(), secure_asset()に至っては、簡単な回避方法はない。