問題
ジャズライブの感想を投稿できるアプリをチーム開発しています。
HerokuにデプロイしたアプリのURLはHTTPSなのですが、感想を投稿した後(=form送信&DB接続後)、トップページにリダイレクトさせるとなぜかHTTPになってしまう問題に直面しました。
ルーティングやリダイレクトに問題があるのかと探っていましたが、解決策は違うところにありました。答えは公式ドキュメントに→「Laravel 7.x HTTPリクエスト 信用するプロキシの設定」
これ、解決策はあっという間にできるのですが、この現象そのものをきちんと理解するのが初心者には大変です...。
原因
上記リンクの公式ドキュメントに説明があります。
信用するプロキシの設定
TLS/SSL証明を行うロードバランサの裏でアプリケーションが実行されている場合、アプリケーションがときどきHTTPSリンクを生成しないことに、気づくでしょう。典型的な理由は、トラフィックがロードバランサにより80番ポートへフォワーディングされるため、セキュアなリンクを生成すべきだと判断できないからです。
(公式ドキュメントより抜粋)
初心者の同志よ...これ言っている意味わかります?(笑)
僕にはほぼ全ての名詞がわかりませんでした(涙)
- プロキシ:ブラウザとサーバーの間に存在していて、僕らのアプリにアクセスしてくるあらゆるコンピュータ、ソフトウェアのこと。proxyとは英語で代理人の意味。
- TLS:Transport Layer Security。公開鍵証明書による通信相手の認証と、通信の暗号化をしつつ、データを送受信するプロトコル(=通信規約)の一つ。HTTPと合体してHTTPS(HTTP over SSL/TLS)になる。
- SSL:TLSの前任者。
- ロードバランサ:負荷(load)分散装置(blancer)。 サーバーを複数台配置して、各サーバーの負荷のバランスを図る人。ただ上記文章では、プロキシみたいな文脈で使われているようです。
- 80番ポート:ポート番号80はHTTP。HTTPSは443。IPアドレスが各コンピュータ(PCやサーバー)を特定するための住所、ポート番号はその先の部屋番号。
- セキュアなリンク:HTTPSのリンクのこと。
一説によると、Herokuは僕らのアプリを安全なところで保管してくれているので、基本はわざわざ暗号化の手間がかかるHTTPSではなくHTTPで接続するとのこと。Herokuのアプリケーションサーバーにアクセスできるプロキシは限定されていて、安全性が担保されており、暗号化の必要はない、だから80番(HTTP)にフォワードするということみたいです。それならばなぜデフォルトがHTTPSなのかが謎なところですが。。。
解決策
6文字追記するだけです...
<?php
namespace App\Http\Middleware;
use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string|null
*/
protected $proxies = '*'; //ここに' = *'を追加するのみ!
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
$proxiesに信用するプロキシのIPアドレスを追加します。'*'
は全プロキシを信用するという設定です。HerokuのプロキシのIPアドレスが分からず、Herokuのセキュリティレベルならこれでも大丈夫そうということで、これを採用しました。
何かご指摘などございましたら、ぜひコメントにてよろしくお願い申し上げます。