Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

Laravelを常時SSL化する(初心者向け)

PHP・Laravelで作成したアプリをAWSのEC2へデプロイする際に、本番環境では常にHTTPS通信を行うことになると思います。
何も設定しないとHTTP通信になってしまうので、この記事ではLaravelをセキュア(=暗号化)な状態で通信するための設定を記載します。

環境の設定

config/app.php
'env' => env('APP_ENV', '〇〇〇'),

〇〇〇の箇所について、開発環境の場合(ローカルで開発する際)はlocal、本番環境の場合(デプロイする際)はproductionにしてください。
ここを設定することで、開発環境か本番環境のどちらか切り替えることができます。

URLをhttpsにする

AppServiceProvider.phpを下記のように追記してください。

app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\URL; //追記

class AppServiceProvider extends ServiceProvider
{
    //略

    public function boot()
    {
        // ここから追記
        if (config('app.env') === 'production') {
            URL::forceScheme('https');
        }
        // ここまで追記
    }
}

これで開発環境の時のURLがhttp、本番環境の時のURLがhttpsになりました。

本番環境において、httpでアクセスされた際にhttpsへリダイレクトさせるための処理

middlewareの作成

次のコマンドを実行してmiddlewareを作成します。RedirectToHttpsの箇所はご自身が作りたいクラス名を記載してください。

$ php artisan make:middleware RedirectToHttps

作成されたRedirectToHttps.phpを下記のように追記してください。

app/Http/Middleware/RedirectToHttps.php
<?php

namespace App\Http\Middleware;

use Closure;

class RedirectToHttps
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // ここから追記
        //このhandleメソッドで判別
        if (!$this->is_ssl() && config('app.env') === 'production') {
            return redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
        }
        // ここまで追記

        return $next($request);
    }

    // ここから追記
    //Webサーバー毎にキーと値で判別
    public function is_ssl()
    {
        if (isset($_SERVER['HTTPS']) === true) { // Apache
            return ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] === '1');
        }
        elseif (isset($_SERVER['SSL']) === true) { // IIS
            return ($_SERVER['SSL'] === 'on');
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) === true) { // Reverse proxy
            return (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https');
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PORT']) === true) { // Reverse proxy
            return ($_SERVER['HTTP_X_FORWARDED_PORT'] === '443');
        }
        elseif (isset($_SERVER['SERVER_PORT']) === true) {
            return ($_SERVER['SERVER_PORT'] === '443');
        }

        return false;
    }
    // ここまで追記
}

Kernel.phpに登録

先程作成したRedirectToHttps.phpの内容を反映させるために、Kernel.phpのprotected $middlewareに追記します。

app/Http/Kernel.php
    // 略

    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\RedirectToHttps::class, // 追記
    ];

    // 略

補足

全プロキシを信用

全プロキシを信用するために、TrustProxies.phpに*を追記します。

app\Http\Middleware\TrustProxies.php
protected $proxies = '*';

詳細は信用するプロキシの設定を確認してください。

CSSを反映させる

URLがhttpsになると、CSSが適用されません。
assetsecure_assetにすることで反映されます。
app.blade.phpのheaderタグにおいて、CSSを適用している箇所をこのように書き換えると良いと思います。

resources/views/app.blade.php
    @if(config('app.env') === 'production')
        <link rel="stylesheet" href="{{ secure_asset('css/app.css') }}">
    @else
        <link rel="stylesheet" href="{{ asset('css/app.css') }}">
    @endif

開発環境(http)の時はasset、本番環境(https)の時はsecure_assetにすることで、CSSが通常通り反映されます。

AWS側の設定

SSL証明書の作成、ロードバランサー、セキュリティーグループ等の設定が必要になります。
この記事がとてもわかりやすかったので、共有しておきます。
一点補足することがあります。
上記の記事ではロードバランサーの作成において、最後にターゲットの確認をして、Health statushealthyになっています。
しかし、URLをhttpからhttpsへリダイレクトさせると、Health statusunhealthyになってしまします。
unhealthyになっていても通常通り動くので、大した問題ではありません。
ただ、unhealtyが気になる方は、下記の設定を行うことでhealthyになります。
1.ターゲットグループを選択
2.Health CheckのEditをクリック
3.Advanced health check settingsのSuccess codesに302を追加し、Save changesをクリック
Edit health check settings.PNG

参考記事

Laravelで作ったサービスをSSL化した時にやったことと参考記事一覧
LaravelでURLをHTTPS化させるメモ (Heroku)
https対応したLaravelプロジェクトでassetを使う時の注意点
EC2上のwebサーバをSSL化対応

おわりに

最後まで読んでいただき、ありがとうございます。
間違いがあればご指摘いただけると幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?