미들웨어 생성

아래 명령어를 실행하면 app/http/Middleware/ 경로에 ForceSSL.php 파일이 생성됩니다.

php artisan make:middleware ForceSSL

생성된 파일을 열어서 handle 함수에 http를 https로 redirect하는 코드를 작성하시면 됩니다.

저 같은 경우에는 APP_ENV 변수가 prod나 production일 경우에만 http 체크를 하도록 했지만 모든 환경에서 적용하기를 원하시면 해당 조건을 제거하시기 바랍니다.

namespace App\Http\Middleware;

use Closure;

class ForceSSL
{
    /**
        * Handle an incoming request.
        *
        * @param  \Illuminate\Http\Request  $request
        * @param  \Closure  $next
        * @return mixed
        */
    public function handle($request, Closure $next)
    {
        if (!$request->secure() && (env('APP_ENV') === 'prod' || env('APP_ENV') === 'production')) {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }
}

커널 등록

생성한 미들웨어를 커널에 등록해주어야 사용할 수 있습니다.

app/Http/Kernel.php 파일을 열어서 $routeMiddleware 배열에 위에서 생성한 미들웨어를 추가합니다.

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    ...생략 

    protected $routeMiddleware = [
        ...생략
        'forcessl' => \App\Http\Middleware\ForceSSL::class
    ];
}

사용하기

모든 페이지에서 SSL을 사용해도 상관없지만 보통 로그인 페이지나 패스워드가 포함되어 있는 페이지에서 사용하겠죠?

로그인 페이지에 등록하기
로그아웃 같은 경우에는 예외 처리 하지 않으면 http 페이지에서 로그아웃 할 때 에러가 발생합니다.

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use GuzzleHttp\Client;

class LoginController extends Controller
{
    ...생략
    public function __construct()
    {
        ...생략
        $this->middleware('forcessl', ['except' => 'logout']);
    }
    ...생략

라우터에서 사용하기

...생략
Route::get('admin/profile', function () {
    //
})->middleware('forcessl');
...생략