Laravel5 で httpsサイトを作る方法。および、Cloud9の80ポート問題解決法

Cloud9でLaravel開発をしていると、良く出るのが、Port80問題。

■Cloud9 adds port 80 to Laravel route
https://community.c9.io/t/cloud9-adds-port-80-to-laravel-route/475

よく分からないが、いろいろやってみたところ、
下記2条件を満たしたときに、発生する模様。

  • 現在いるページがhttp://~
  • 相対パス(<a href=”/~”)で書かれているリンクを押した

もともとcloud9はhttps://で動くものなのですが、
Laravelは、デフォルトでhttpのフルパス(<a href=”http://~”)を出力するため、
知らず知らずのうちに、http://に移動して、エラーが出るようです。

ということで、Laravelが常にhttps://で動くようにすればOK。
以下、解決法です。

■Laravel 5 – redirect to HTTPS
http://stackoverflow.com/questions/28402726/laravel-5-redirect-to-https

修正するファイルは2つ

# /app/Http/Middleware/ForceHttps.php
https://github.com/dog-ears/force_https_on_laravel/blob/master/app/Http/Middleware/ForceHttps.php

    public function handle($request, Closure $next)
    {
//        if (!app()->environment('local')) {
            // for Proxies
            Request::setTrustedProxies([$request->getClientIp()]);
            if (!$request->isSecure()) {
                return redirect()->secure($request->getRequestUri());
            }
//        }
        return $next($request);
    }

environmentで判断する機能は、とりあえず不要なので、コメントアウトしてます。

基本的には、$request が sequre(https)かどうか判断して、
httpsでなければ、httpsに変更する。ただそれだけです。

ただ、Cloud9は、仕様上、httpsでリクエストが飛んできても、

$request->isSecure()

に、falseを返してしまうため、このままだと永久ループしてしまいます。
(ここの詳細は、現在不明。プロキシの問題らしいのですが・・・)

そのため、下記の一文を追加します。

Request::setTrustedProxies([$request->getClientIp()]);

クライアントIPは、信頼できるプロキシですよー。と、登録してるっぽいです。

# /app/Http/Kernel.php
https://github.com/dog-ears/force_https_on_laravel/blob/master/app/Http/Kernel.php

$middlewareに以下の文を追加。

\App\Http\Middleware\ForceHttps::class,

これで、全ルートにhttp→httpsが適用され、Port80問題は発生しなくなるはずです。
おためしあれ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です