Laravel 5 - przekierowanie do HTTPS

127

Pracuję nad moim pierwszym projektem Laravel 5 i nie jestem pewien, gdzie i jak umieścić logikę, aby wymusić HTTPS w mojej aplikacji. Kluczowe jest tutaj to, że istnieje wiele domen wskazujących na aplikację i tylko dwie na trzy używają SSL (trzecia to domena rezerwowa, długa historia). Chciałbym więc zająć się tym w logice mojej aplikacji, a nie .htaccess.

W Laravel 4.2 przekierowanie dokonałem za pomocą tego kodu, znajdującego się w filters.php:

App::before(function($request)
{
    if( ! Request::secure())
    {
        return Redirect::secure(Request::path());
    }
});

Myślę, że oprogramowanie pośredniczące jest miejscem, w którym powinno zostać zaimplementowane coś takiego, ale nie mogę tego rozgryźć, używając go.

Dzięki!

AKTUALIZACJA

Jeśli używasz Cloudflare tak jak ja, można to osiągnąć, dodając nową regułę strony w panelu sterowania.

NightMICU
źródło
Więc co się dzieje z trzecią domeną? Jeśli wymusisz https na wszystkich trasach - czy trzecia domena będzie nadal działać?
Laurence,
Wykrywanie tego za pomocą$_SERVER['HTTP_HOST']
NightMICU,
Ile czasu minęło, zanim reguła strony Cloudflare zaczęła obowiązywać
CodeGuru
Och, musiałem włączyć proxy w ustawieniach DNS haha!
CodeGuru

Odpowiedzi:

253

Możesz sprawić, by działało z klasą oprogramowania pośredniego. Pozwól, że dam ci pomysł.

namespace MyApp\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); 
    }
}

Następnie zastosuj to oprogramowanie pośredniczące do każdego żądania dodającego ustawienie reguły w Kernel.phppliku, na przykład:

protected $middleware = [
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',

    // appending custom middleware 
    'MyApp\Http\Middleware\HttpsProtocol'       

];

W powyższym przykładzie oprogramowanie pośredniczące przekieruje każde żądanie do https, jeśli:

  1. Bieżące żądanie nie zawiera bezpiecznego protokołu (http)
  2. Jeśli twoje środowisko jest równe production. Po prostu dostosuj ustawienia zgodnie ze swoimi preferencjami.

Cloudflare

Używam tego kodu w środowisku produkcyjnym z WildCard SSL i kod działa poprawnie. Jeśli usunę && App::environment() === 'production'i przetestuję go w localhost, przekierowanie również działa. Tak więc posiadanie lub brak zainstalowanego SSL nie jest problemem. Wygląda na to, że musisz bardzo mocno skupić się na warstwie Cloudflare, aby zostać przekierowanym do protokołu Https.

Edycja 23.03.2015

Dzięki @Adam Linksugestii: jest to prawdopodobnie spowodowane nagłówkami, które mija Cloudflare. CloudFlare prawdopodobnie trafia na twój serwer przez HTTP i przekazuje nagłówek X-Forwarded-Proto, który deklaruje, że przekazuje żądanie HTTPS. Musisz dodać kolejną linię w swoim oprogramowaniu pośrednim, która mówi ...

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

... ufać nagłówkom, które wysyła CloudFlare. Spowoduje to zatrzymanie pętli przekierowań

Edycja 27/09/2016 - Laravel v5.3

Wystarczy dodać klasę oprogramowania pośredniego do webgrupy w kernel.php file:

protected $middlewareGroups = [
    'web' => [
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,

        // here
        \MyApp\Http\Middleware\HttpsProtocol::class

    ],
];

Pamiętaj, że webgrupa jest domyślnie stosowana do każdej trasy, więc nie musisz webjawnie ustawiać tras ani kontrolerów.

Edycja 23/08/2018 - Laravel v5.7

  • Aby przekierować żądanie w zależności od środowiska, którego możesz użyć App::environment() === 'production'. W poprzedniej wersji było env('APP_ENV') === 'production'.
  • Używanie \URL::forceScheme('https');faktycznie nie przekierowuje. Po prostu buduje linki, https://gdy witryna jest renderowana.
manix
źródło
5
Wygląda na to, że tworzy pętlę przekierowań ... ale wygląda na to, że powinno działać. Nie wiem, czy to robi jakąkolwiek różnicę, ale używamy SSL Cloudflare. Ale nie sądzę, żeby to zmieniło proste przekierowanie.
NightMICU
3
@NightMICU Nie jestem pewien, czy rozwiązałeś problem z przekierowaniem, ale jest to prawdopodobnie spowodowane nagłówkami, które przechodzi Cloudflare. CloudFlare prawdopodobnie trafia na twój serwer przez HTTP i przekazuje nagłówek X-Forwarded-Proto, który deklaruje, że przekazuje żądanie HTTPS. Musisz dodać kolejną linię w swoim oprogramowaniu pośrednim, która mówi, $request->setTrustedProxies( [ $request->getClientIp() ] );aby ufać nagłówkom wysyłanym przez CloudFlare. Spowoduje to zatrzymanie pętli przekierowań.
Adam Link
2
@manix Awesome. Właśnie przejrzałem ten problem HTTPS w ten weekend z moim własnym projektem - te małe rzeczy będą cię frustrować przez wiele godzin!
Adam Link
8
Doskonała odpowiedź! Tylko jeden szczegół: lepiej użyć przekierowania 301, aby wskazać Google, że jest to trwały ruch. Na przykład:return redirect()->secure($request->getRequestUri(), 301);
adriaroca
4
dla tych, którzy korzystają z modułu równoważenia obciążenia lub serwera proxy, mogą zmienić na secure (), aby $request->server('HTTP_X_FORWARDED_PROTO') != 'https'to działało dla mnie
Shiro
63

Inna opcja, która zadziałała dla mnie, w AppServiceProvider umieść ten kod w metodzie rozruchu:

\URL::forceScheme('https');

Funkcja napisana przed forceSchema ('https') była błędna, jej forceScheme

Constantin Stan
źródło
16
Hej, po prostu znalazłem to, szukając w Google - zwróć uwagę, że w 5.4 to\URL::forceScheme('https');
dev
5
W tym samym pliku możesz również zrobićif($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
Rory
2
czy miałeś na myśli\URL::forceScheme('https')
Ernest Okot,
17
Jestem pewien, że to tylko do budowania linków. To nie zmusi użytkownika do korzystania z https, będzie obsługiwać tylko linki z przedrostkiem https: //
Weston Watson,
tak, stało się @WestonWatson. uprzejmie udostępnij rozwiązanie, jeśli zostanie znalezione
Harat
33

Alternatywnie, jeśli używasz Apache, możesz użyć .htaccesspliku, aby wymusić na adresach URL używanie httpsprefiksu. W Laravel 5.4 dodałem następujące wiersze do mojego .htaccesspliku i zadziałało.

RewriteEngine On

RewriteCond %{HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Assad Ullah Ch
źródło
2
To nie jest dobre, jeśli masz wiele środowisk (deweloperskich, etapowych, produkcyjnych), niż musisz ustawić SSL na nich wszystkich.
Mladen Janjetovic
@MladenJanjetovic możesz użyć RewriteCond %{HTTP_HOST} !=localhostna dev, aby obejść ten problem.
Dan,
3
@Dan - Tak, ale nadal będziesz musiał ustawić to na stage, local (a to jest bardziej skomplikowane, jeśli programiści używają różnych adresów URL w rozwoju lokalnym, np. .Dev, .local, subdomains, ... itd.). Wolałbym mieć taką logikę w aplikacji.
Mladen Janjetovic
16

dla laravel 5.4 użyj tego formatu, aby uzyskać przekierowanie https zamiast .htaccess

namespace App\Providers;

use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        URL::forceScheme('https');
    }
}
Arun Yokesh
źródło
15
Dla wyjaśnienia: 1) te zmiany należy wprowadzić w pliku app / Providers / AppServiceProvider.php; 2) to tylko po to, aby ustawić linki generowane wewnątrz aplikacji na używanie SSL, nie zmusza cię to do korzystania z SSL
phoenix
Cześć, Trasa nie generuje się tą metodą, jeśli kliknę przycisk, który przekieruje mnie do następnej trasy, nie daje mi błędu 404
Saket Sinha
To nie jest przekierowanie https. Ale pozwala na obsługę witryny https: //. Jeśli zmienisz go na http: //, będzie również służył.
frank
12

Podobna do odpowiedzi manix, ale w jednym miejscu. Oprogramowanie pośredniczące do wymuszania protokołu HTTPS

namespace App\Http\Middleware;

use Closure;

use Illuminate\Http\Request;

class ForceHttps
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    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);
    }
}
Mladen Janjetovic
źródło
czy żądanie musi być statyczne?
GFxJamal,
@jRhesk to chyba nie, ale proszę spróbować i poczuć się swobodnie modyfikować odpowiedź
Mladen Janjetovic
8

Dotyczy to Larave 5.2.xi nowszych. Jeśli chcesz mieć możliwość obsługi niektórych treści przez HTTPS, a innych przez HTTP, oto rozwiązanie, które dla mnie zadziałało. Możesz się zastanawiać, dlaczego ktoś miałby chcieć udostępniać tylko niektóre treści przez HTTPS? Dlaczego nie obsługiwać wszystkiego przez HTTPS?

Chociaż obsługiwanie całej witryny przez HTTPS jest całkowicie w porządku, odcięcie wszystkiego przez HTTPS ma dodatkowe obciążenie na serwerze. Pamiętaj, że szyfrowanie nie jest tanie. Niewielki narzut ma również wpływ na czas odpowiedzi aplikacji. Można argumentować, że sprzęt jest tani, a wpływ jest znikomy, ale dygresję :) Nie podoba mi się pomysł obsługi dużych stron treści marketingowych z obrazami itp. Przez https. Więc oto jest. Jest podobny do tego, co inni sugerują powyżej, używając oprogramowania pośredniego, ale jest to pełne rozwiązanie, które pozwala przełączać się między HTTP / HTTPS.

Najpierw utwórz oprogramowanie pośredniczące.

php artisan make:middleware ForceSSL

Tak powinno wyglądać Twoje oprogramowanie pośredniczące.

<?php

namespace App\Http\Middleware;

use Closure;

class ForceSSL
{

    public function handle($request, Closure $next)
    {

        if (!$request->secure()) {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }
}

Zauważ, że nie filtruję na podstawie środowiska, ponieważ mam konfigurację HTTPS zarówno dla lokalnego tworzenia, jak i produkcji, więc nie ma takiej potrzeby.

Dodaj poniższe do swojej trasy: RouteMiddleware \ App \ Http \ Kernel.php, abyś mógł wybrać i wybrać, która grupa tras ma wymuszać SSL.

    protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'forceSSL' => \App\Http\Middleware\ForceSSL::class,
];

Następnie chciałbym zabezpieczyć logowanie / rejestrację w dwóch podstawowych grupach itp. I wszystko inne za oprogramowaniem pośredniczącym uwierzytelniania.

Route::group(array('middleware' => 'forceSSL'), function() {
/*user auth*/
Route::get('login', 'AuthController@showLogin');
Route::post('login', 'AuthController@doLogin');

// Password reset routes...
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');

//other routes like signup etc

});


Route::group(['middleware' => ['auth','forceSSL']], function()
 {
Route::get('dashboard', function(){
    return view('app.dashboard');
});
Route::get('logout', 'AuthController@doLogout');

//other routes for your application
});

Upewnij się, że oprogramowanie pośredniczące jest prawidłowo stosowane do tras z konsoli.

php artisan route:list

Teraz, gdy zabezpieczyłeś wszystkie formularze lub wrażliwe obszary aplikacji, kluczem jest teraz użycie szablonu widoku do zdefiniowania bezpiecznych i publicznych (innych niż HTTPS) łączy.

Na podstawie powyższego przykładu wyrenderowałbyś swoje bezpieczne linki w następujący sposób -

<a href="{{secure_url('/login')}}">Login</a>
<a href="{{secure_url('/signup')}}">SignUp</a>

Niezabezpieczone linki mogą być renderowane jako

<a href="{{url('/aboutus',[],false)}}">About US</a></li>
<a href="{{url('/promotion',[],false)}}">Get the deal now!</a></li>

To powoduje renderowanie w pełni kwalifikowanego adresu URL, takiego jak https: // twójhost / login i http: // twójhost / aboutus

Jeśli nie wyrenderujesz w pełni kwalifikowanego adresu URL za pomocą http i użyjesz względnego adresu URL linku („/ aboutus”), to https będzie się utrzymywał po odwiedzeniu przez użytkownika bezpiecznej witryny.

Mam nadzieję że to pomoże!

na-98
źródło
7

A co z użyciem pliku .htaccess , aby uzyskać przekierowanie https? Powinien być umieszczony w katalogu głównym projektu (nie w folderze publicznym). Twój serwer musi być skonfigurowany tak, aby wskazywał katalog główny projektu.

<IfModule mod_rewrite.c>
   RewriteEngine On
   # Force SSL
   RewriteCond %{HTTPS} !=on
   RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Remove public folder form URL
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Używam tego dla laravel 5.4 (najnowsza wersja w chwili pisania tej odpowiedzi), ale powinno nadal działać dla wersji funkcji, nawet jeśli laravel zmieni lub usunie niektóre funkcje.

Maulik Gangani
źródło
Chrome wyświetla mi błąd: zbyt wiele przekierowań ... Wygląda na to, że zapętla się
phoenix
Cześć, zaktualizowałem odpowiedź. Upewnij się, że umieściłeś ten plik .htaccess w katalogu głównym projektu i wskaż serwerowi (konfiguracja apache) katalog główny projektu.
Maulik Gangani
1
@MladenJanjetovic możesz mieć różne pliki htaccess dla tych środowisk
Burgi
1
@MladenJanjetovic posiadanie go w aplikacji z pewnością ma swoje zalety, ale z punktu widzenia wydajności i szybkości powiedziałbym, że korzystne jest posiadanie tego w konfiguracji serwera, aby nie trzeba było ładować Laravela tylko w celu przekierowania. Konfiguracje specyficzne dla środowiska w pojedynczej wersji .htaccess można osiągnąć, używając warunku przepisywania w celu sprawdzenia domeny, na przykładRewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Chris
1
Ja też wolę umieścić to w .htaccess w katalogu głównym i, jak powiedział Crhis, można tutaj dokonać ustawień specyficznych dla środowiska, choć nieco mniej elegancko niż w rozwiązaniu Mladena.
jovan
6

Możesz użyć RewriteRule, aby wymusić ssl w .htaccess ten sam folder z twoim index.php
Proszę dodać jako zdjęcie jako załączenie, dodaj je przed wszystkimi innymi regułami ustawienie ssl .htaccess

Quy Le
źródło
4

Dodaję tę alternatywę, ponieważ bardzo cierpiałem z tym problemem. Próbowałem różnych sposobów i nic nie działało. Więc wymyśliłem obejście tego problemu. Może to nie jest najlepsze rozwiązanie, ale działa -

FYI, używam Laravel 5.6

if (App::environment('production')) {
    URL::forceScheme('https');
}

produkcja <- Należy ją zastąpić wartością APP_ENV w pliku .env

brązowe dziecko
źródło
3

w IndexController.php umieścić

public function getIndex(Request $request)
{
    if ($request->server('HTTP_X_FORWARDED_PROTO') == 'http') {

        return redirect('/');
    }

    return view('index');
}

w AppServiceProvider.php umieścić

public function boot()
{
    \URL::forceSchema('https');

}

W AppServiceProvider.php każde przekierowanie będzie skierowane do adresu URL https, a dla żądania http potrzebujemy raz przekierować, więc w IndexController.php wystarczy raz przekierować

Artur Qaramyan
źródło
Czy możesz wyjaśnić, w jaki sposób Twoja odpowiedź rozwiązuje pytanie?
soundlikeodd
Dodaj to wyjaśnienie do swojej odpowiedzi.
soundlikeodd
2

Oto jak to zrobić na Heroku

Aby wymusić SSL na swoich hamowniach, ale nie lokalnie, dodaj na końcu swojego .htaccess w public /:

# Force https on heroku...
# Important fact: X-forwarded-Proto will exist at your heroku dyno but wont locally.
# Hence we want: "if x-forwarded exists && if its not https, then rewrite it":
RewriteCond %{HTTP:X-Forwarded-Proto} .
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Możesz to przetestować na swoim komputerze lokalnym za pomocą:

curl -H"X-Forwarded-Proto: http" http://your-local-sitename-here

To ustawia nagłówek X-przekazany do postaci, jaką przyjmie na heroku.

tj. symuluje sposób, w jaki hamownia heroku zobaczy żądanie.

Otrzymasz tę odpowiedź na komputerze lokalnym:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://tm3.localhost:8080/">here</a>.</p>
</body></html>

To jest przekierowanie. Właśnie to heroku zwróci klientowi, jeśli ustawisz .htaccess jak powyżej. Ale to się nie dzieje na twoim lokalnym komputerze, ponieważ X-forwarded nie zostanie ustawione (sfałszowaliśmy to za pomocą curl powyżej, aby zobaczyć, co się dzieje).

mwal
źródło
2

Jeśli używasz CloudFlare, możesz po prostu utworzyć regułę strony, aby zawsze używać HTTPS: Wymuś SSL Cloudflare spowoduje to przekierowanie każdego żądania http: // na https: //

Oprócz tego musiałbyś również dodać coś takiego do swojej funkcji \ app \ Providers \ AppServiceProvider.php boot ():

if (env('APP_ENV') === 'production' || env('APP_ENV') === 'dev') {
     \URL::forceScheme('https');
}

Zapewniłoby to, że każdy link / ścieżka w Twojej aplikacji używa https: // zamiast http: //.

butaminas
źródło
2

Trochę inne podejście, przetestowane w Laravel 5.7

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Str;

class ForceHttps
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {    
        if ( !$request->secure() && Str::startsWith(config('app.url'), 'https://') ) {
            return redirect()->secure($request->getRequestUri());
        }
        return $next($request);
    }
}

PS. Kod zaktualizowany na podstawie komentarzy @ matthias-lill.

Zoli
źródło
1
Działa również na Laravel 6.
Rubens
1
użycie funkcji env () nie będzie działać z buforowanymi plikami konfiguracyjnymi. To powinno wskazywać config('app.url')zamiast tego. Ponadto Laravel posiada bardzo przydatną funkcję string Str::startsWith(config('app.url'), 'https://').
Matthias Lill
1

W przypadku Laravel 5.6 musiałem trochę zmienić stan, aby działał.

z:

if (!$request->secure() && env('APP_ENV') === 'prod') {
return redirect()->secure($request->getRequestUri());
}

Do:

if (empty($_SERVER['HTTPS']) && env('APP_ENV') === 'prod') {
return redirect()->secure($request->getRequestUri());
}
Priyank
źródło
1

To mi się udało. Zrobiłem niestandardowy kod php, aby wymusić przekierowanie go na https. Po prostu umieść ten kod w pliku header.php

<?php
if (isset($_SERVER['HTTPS']) &&
    ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $protocol = 'https://';
}
else {
  $protocol = 'http://';
}
$notssl = 'http://';
if($protocol==$notssl){
    $url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>
    <script> 
    window.location.href ='<?php echo $url?>';
    </script> 
 <?php } ?>
Geeky Ashim
źródło
1

Używam w Laravel 5.6.28 następnego oprogramowania pośredniego:

namespace App\Http\Middleware;

use App\Models\Unit;
use Closure;
use Illuminate\Http\Request;

class HttpsProtocol
{
    public function handle($request, Closure $next)
    {
        $request->setTrustedProxies([$request->getClientIp()], Request::HEADER_X_FORWARDED_ALL);

        if (!$request->secure() && env('APP_ENV') === 'prod') {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }
}
fomvasss
źródło
1

Najprościej byłoby na poziomie aplikacji. W pliku

app/Providers/AppServiceProvider.php

dodaj następujące informacje:

use Illuminate\Support\Facades\URL;

i w metodzie boot () dodaj:

$this->app['request']->server->set('HTTPS', true);
URL::forceScheme('https');

Powinno to przekierować wszystkie żądania do https na poziomie aplikacji.

(Uwaga: zostało to przetestowane z laravel 5.5 LTS)

Pinak Saha
źródło
1

Możesz po prostu przejść do aplikacji -> Dostawcy -> AppServiceProvider.php

dodaj dwie linie

użyj Illuminate \ Support \ Facades \ URL;

URL :: forceScheme ('https');

jak pokazano w poniższych kodach:

use Illuminate\Support\Facades\URL;

class AppServiceProvider extends ServiceProvider
{
   public function boot()
    {
        URL::forceScheme('https');

       // any other codes here, does not matter.
    }
Wria Mohammed
źródło
0

To działa dla mnie w Laravel 7.x w 3 prostych krokach przy użyciu oprogramowania pośredniczącego:

1) Wygeneruj oprogramowanie pośredniczące za pomocą polecenia php artisan make:middleware ForceSSL

Oprogramowanie pośredniczące

<?php

namespace App\Http\Middleware;

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

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

        return $next($request);
    }
}

2) Zarejestruj oprogramowanie pośredniczące w routeMiddlewarepliku jądra

Jądro

protected $routeMiddleware = [
    //...
    'ssl' => \App\Http\Middleware\ForceSSL::class,
];

3) Użyj go w swoich trasach

Trasy

Route::middleware('ssl')->group(function() {
    // All your routes here

});

tutaj pełna dokumentacja dotycząca oprogramowania pośredniego

========================

Metoda HTACCESS

Jeśli wolisz użyć .htaccesspliku, możesz użyć następującego kodu:

<IfModule mod_rewrite.c>
    RewriteEngine On 
    RewriteCond %{SERVER_PORT} 80 
    RewriteRule ^(.*)$ https://yourdomain.com/$1 [R,L]
</IfModule>

Pozdrowienia!

Radames E. Hernandez
źródło