以前に 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
が配置されます。
例えば以下のように、信頼されるアクセス元の情報を配列で指定しましょう。
'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 でも処理したい場合に対処できない。