Laravel プロジェクトで AWS の ELB(ALB) 443(HTTPS) -> EC2 80(HTTP) とした時、 route() などを期待した動作(https)にする

  • 2
    いいね
  • 0
    コメント

以前に Laravel プロジェクトを AWS の ELB 443(HTTPS) -> EC2 80(HTTP) とした時、強制的に HTTPS にする方法 というのを書きました。

実は、以前の方法である URL::forceSchema('https'); を使うのはあまりよろしくありません。

どうするのが良さそうか

https://github.com/fideloper/TrustedProxy を使う。

laravel 5.5 からはデフォルトで入ってるはず。

5.4 以前を使っている場合は https://github.com/fideloper/TrustedProxy#tldr-setup に従ったインストールしましょう。

$ php artisan vendor:publish --provider="Fideloper\Proxy\TrustedProxyServiceProvider"

これで、 ./config/trustedproxy.php が配置されます。

例えば以下のように、信頼されるアクセス元の情報を配列で指定しましょう。

/config/trustedproxy.php
    'proxies' => [
        // '172.31.0.0/16',
        '10.0.0.0/24',
        '10.0.1.0/24',
    ],
     // 全部信頼できるなら以下のように指定しても OK らしい
     # 'proxies' => '*',

これだけ。

そもそも何が起きているか

※前回も書いたけど。

ELB で https(443) を待ち受けて、内部の EC2 に http(80) で転送していると、 Laravel プロジェクト的には http で動作していることになる。

このため、 route() や redirect() などが、 http:// となってしまう。

期待する動作は、何も意識せずに route() などの結果が https:// になって欲しい。

URL::forceSchema('https'); は何が問題なのか

全部の URL が https:// になる。

全て https で処理するなら問題ないが、何らかの理由があって、 http でも処理したい場合に対処できない。