Laravelでロードバランサを挟んだ時のisSecure判定を動作させる

Laravelの小ネタ。
ELBなどのロードバランサを挟むと RequestisSecure が正しく動作してくれなかったのでメモ。

ブレードでリンクを生成する時に、`と記述して組み立てていたのだが、ローカル環境では正しくhttpsのURLで絶対パスが指定されていたのに、herokuにアップした途端にhttp`で生成されるようになってしまった。

Requestroot()がどうやって判定しているのかを辿っていくと、getScheme()というRequestの関数内で、以下のように判定して取得していた。

1
2
3
4
public function getScheme()
{
    return $this->isSecure() ? 'https' : 'http';
}

よってこの、isSecureが正しく動作していないと思われる。
Herokuはロードバランサが標準で入っているため、その辺りだろうとググってみると公式ドキュメントがヒット。

TLS/SSL証明を行うロードバランサの裏でアプリケーションが実行されている場合、アプリケーションが時々HTTPSリンクを生成しないことに、気づくでしょう。典型的な理由は、トラフィックがロードバランサにより80番ポートへフォワーディングされるため、セキュアなリンクを生成すべきだと判断できないからです。

まさにこの通りで、app/Http/Middleware/TrustProxies.phpで全てのプロキシを信用するようにしたところ、無事、httpsで生成されるようになった。

1
protected $proxies = '**';

Amazon AWSや他の「クラウド」ロードバランサプロバイダを使用している場合は、実際のバランサのIPアドレスは分かりません。このような場合、全プロキシを信用するために、**を使います。

   このエントリーをはてなブックマークに追加