iT邦幫忙

1

Laravel 專案強制使用 HTTPS

問題

當我們將 Laravel 專案部署到網路上之後,可能會申請域名和憑證。但是卻不能確保使用者必然使用 HTTPS 連線至我們的網站。故想要強制將 HTTP 轉為 HTTPS。

解決

概念

為所有 route 綁上 middleware。當有 request 進來的時候,判斷是否為 HTTPS,如若不是,則改以 HTTPS 重新導向。

實作

HttpsProtocol.php

在 專案根目錄/app/Http/Middleware 裡建立 HttpsProtocol.php。檔案程式碼如下:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
            if (!$request->secure() && App::environment() === 'production') {
                return redirect()->secure($request->getRequestUri());
            }

            return $next($request); 
    }
}

說明

在 handle() 裡,$request->secure() 判斷請求是否為 SSL,如果是會回傳 true,否則回傳 false。

App::environment() 則是去抓 .env 的 APP_ENV 環境變數。只有當 .env 設定為 APP_ENV=production 時會回傳 true。

當兩個判斷皆為真,才會改以 HTTPS 重新導向。所以在本地開發的時候設定 APP_ENV=local 就不會受到影響,而在部署好的專案裡只要將變數設定為 APP_ENV=production 即可作用。

以上,已經完成強制重新導向的檔案了。接下來要套用它。

Kernel.php

在 專案根目錄/app/Http 裡修改 Kernel.php。程式碼片段如下:

    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

        // 加上這行套用上面寫好的 Middleware
        \App\Http\Middleware\HttpsProtocol::class, 
    ];

說明

以上,則能讓所有 route 被訪問前都先經過此 middleware 過濾。

完成!

參考網站

https://stackoverflow.com/questions/28402726/laravel-5-redirect-to-https

原文作者在 Laravel 5 上實作。筆者則是在 Laravel 7 上實作,亦可以順利執行。


尚未有邦友留言

立即登入留言