Laravel 5 - Weiterleitung zu HTTPS

126

Ich arbeite an meinem ersten Laravel 5-Projekt und weiß nicht, wo oder wie ich Logik platzieren soll, um HTTPS in meiner App zu erzwingen. Der Clou dabei ist, dass es viele Domains gibt, die auf die App verweisen, und nur zwei von drei verwenden SSL (die dritte ist eine Fallback-Domain, lange Geschichte). Daher möchte ich dies eher in der Logik meiner App als in .htaccess behandeln.

In Laravel 4.2 habe ich die Umleitung mit diesem Code durchgeführt, der sich befindet in filters.php:

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

Ich denke, in Middleware sollte so etwas implementiert werden, aber ich kann das nicht ganz herausfinden.

Vielen Dank!

AKTUALISIEREN

Wenn Sie Cloudflare wie ich verwenden, wird dies durch Hinzufügen einer neuen Seitenregel in Ihrem Control Panel erreicht.

NightMICU
quelle
Was passiert also mit der 3. Domain? Wenn Sie https auf allen Routen erzwingen, funktioniert die dritte Domain dann weiter?
Laurence
Erkennen, dass mit$_SERVER['HTTP_HOST']
NightMICU
Wie lange hat es gedauert, bis die Cloudflare-Seitenregel wirksam wurde
CodeGuru
Oh, ich musste den Proxy in der DNS-Einstellung einschalten, haha!
CodeGuru

Antworten:

252

Sie können dafür sorgen, dass es mit einer Middleware-Klasse funktioniert. Lassen Sie mich Ihnen eine Idee geben.

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); 
    }
}

Wenden Sie diese Middleware dann auf jede Anforderung an, indem Sie die Regel in der Kernel.phpDatei wie folgt festlegen :

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'       

];

Im obigen Beispiel leitet die Middleware jede Anforderung an https um, wenn:

  1. Die aktuelle Anfrage enthält kein sicheres Protokoll (http).
  2. Wenn Ihre Umgebung gleich ist production. Passen Sie die Einstellungen einfach an Ihre Vorlieben an.

Cloudflare

Ich verwende diesen Code in einer Produktionsumgebung mit einem WildCard-SSL und der Code funktioniert ordnungsgemäß. Wenn ich && App::environment() === 'production'es in localhost entferne und teste, funktioniert die Umleitung auch. Ein installiertes SSL zu haben oder nicht, ist also nicht das Problem. Sieht so aus, als müssten Sie Ihre Cloudflare-Ebene sehr genau beobachten, um zum HTTP-Protokoll umgeleitet zu werden.

Bearbeiten 23/03/2015

Dank des @Adam LinkVorschlags von Cloudflare wird dies wahrscheinlich durch die Header verursacht. CloudFlare trifft Ihren Server wahrscheinlich über HTTP und übergibt einen X-Forwarded-Proto-Header, der angibt, dass eine HTTPS-Anforderung weitergeleitet wird. Sie müssen Ihrer Middleware eine weitere Zeile hinzufügen, die besagt ...

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

... um den Headern zu vertrauen, die CloudFlare sendet. Dadurch wird die Umleitungsschleife gestoppt

Bearbeiten 27/09/2016 - Laravel v5.3

Sie müssen nur die Middleware-Klasse zur webGruppe hinzufügen in 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

    ],
];

Denken Sie daran, dass die webGruppe standardmäßig auf jede Route angewendet wird, sodass Sie weder webin Routen noch in Controllern explizit festlegen müssen .

Bearbeiten 23/08/2018 - Laravel v5.7

  • Umleiten einer Anforderung abhängig von der Umgebung, die Sie verwenden können App::environment() === 'production'. Für die Vorgängerversion war env('APP_ENV') === 'production'.
  • Verwenden \URL::forceScheme('https');leitet eigentlich nicht um. Es werden nur Links erstellt, https://sobald die Website gerendert ist.
Manix
quelle
5
Dies scheint mir eine Umleitungsschleife zu geben ... sieht aber so aus, als ob es funktionieren sollte. Ich weiß nicht, ob es einen Unterschied macht, aber wir verwenden ein Cloudflare-SSL. Aber ich denke nicht, dass dies die einfache Weiterleitung ändern würde.
NightMICU
3
@NightMICU Ich bin nicht sicher, ob Sie das Problem mit der Umleitung gelöst haben, aber es wird wahrscheinlich durch die Header verursacht, die Cloudflare übergibt. CloudFlare trifft Ihren Server wahrscheinlich über HTTP und übergibt einen X-Forwarded-Proto-Header, der angibt, dass eine HTTPS-Anforderung weitergeleitet wird. Sie müssen Ihrer Middleware eine weitere Zeile hinzufügen, die besagt $request->setTrustedProxies( [ $request->getClientIp() ] );, dass Sie den von CloudFlare gesendeten Headern vertrauen sollen. Dadurch wird die Umleitungsschleife gestoppt.
Adam Link
2
@ Manix Super. Ich habe dieses Wochenende diese HTTPS-Ausgabe mit meinem eigenen Projekt durchgesehen - dieses kleine Zeug wird dich stundenlang frustrieren!
Adam Link
8
Hervorragende Antwort! Nur ein Detail: Es ist besser, eine 301-Weiterleitung zu verwenden, um Google anzuzeigen, dass es sich um eine permanente Bewegung handelt. Wie:return redirect()->secure($request->getRequestUri(), 301);
Adriaroca
4
für diejenigen, die unter Load Balancer oder Proxy wechseln können, um zu sichern (), $request->server('HTTP_X_FORWARDED_PROTO') != 'https'funktioniert dies für mich
Shiro
63

Eine andere Option, die für mich funktioniert hat, ist, dass AppServiceProvider diesen Code in die Startmethode einfügt:

\URL::forceScheme('https');

Die vor forceSchema ('https') geschriebene Funktion war falsch, ihr forceScheme

Constantin Stan
quelle
16
Hey, habe das gerade durch googeln gefunden - beachte, dass es in 5.4 ist\URL::forceScheme('https');
dev
5
In der gleichen Datei können Sie auch tunif($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
Rory
2
Meinten Sie\URL::forceScheme('https')
Ernest Okot
17
Ich bin mir ziemlich sicher, dass dies nur zum Erstellen von Links dient. Dies zwingt einen Benutzer nicht zu https, sondern dient nur Links, denen https: //
Weston Watson
Ja, es ist passiert @WestonWatson. Bitte teilen Sie die Lösung, wenn gefunden
Harat
33

Wenn Sie Apache verwenden, können Sie alternativ die .htaccessDatei verwenden, um Ihre URLs zur Verwendung des httpsPräfixes zu zwingen. Auf Laravel 5.4 habe ich die folgenden Zeilen zu meiner .htaccessDatei hinzugefügt und es hat bei mir funktioniert.

RewriteEngine On

RewriteCond %{HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Assad Ullah Ch
quelle
2
Dies ist nicht gut, wenn Sie mehrere Umgebungen (Entwickler, Bühne, Produktion) haben, als Sie SSL für alle festlegen müssen.
Mladen Janjetovic
@MladenJanjetovic können Sie RewriteCond %{HTTP_HOST} !=localhostauf dev verwenden, um dies zu umgehen .
Dan
3
@Dan - Ja, aber Sie müssen es immer noch für Stage, Local einrichten (und dies ist komplizierter, wenn Entwickler in der lokalen Entwicklung unterschiedliche URLs verwenden, z. B. .dev, .local, Subdomains usw.). Ich würde es vorziehen, diese Art von Logik in der Anwendung zu haben.
Mladen Janjetovic
16

Verwenden Sie für Laravel 5.4 dieses Format, um eine https-Umleitung anstelle von .htaccess zu erhalten

namespace App\Providers;

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

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        URL::forceScheme('https');
    }
}
Arun Yokesh
quelle
15
Zur Verdeutlichung: 1) Diese Änderungen sollten in app / Providers / AppServiceProvider.php vorgenommen werden. 2) Dies ist nur, um die in der App generierten Links für die Verwendung von SSL einzustellen. Es zwingt Sie nicht, SSL zu verwenden
Phoenix
Hallo, Route wird nicht durch diese Methode generiert, wenn ich auf eine Schaltfläche klicke, die mich zur nächsten Route sendet. Es gibt mir nicht den Fehler 404
Saket Sinha
Dies ist keine https-Weiterleitung. Es ermöglicht jedoch die Bereitstellung von https: // Site. Wenn Sie es in http: // ändern, wird es auch dienen.
Franken
12

Ähnlich wie Manix 'Antwort, aber an einem Ort. Middleware zum Erzwingen von 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
quelle
Muss die Anfrage statisch sein?
GFxJamal
@ jRhesk es wahrscheinlich nicht, aber bitte versuchen Sie, die Antwort zu ändern
Mladen Janjetovic
8

Dies gilt für Larave 5.2.x und höher. Wenn Sie die Option haben möchten, einige Inhalte über HTTPS und andere über HTTP bereitzustellen, ist hier eine Lösung, die für mich funktioniert hat. Sie fragen sich vielleicht, warum jemand nur einige Inhalte über HTTPS bereitstellen möchte? Warum nicht alles über HTTPS servieren?

Obwohl es völlig in Ordnung ist, die gesamte Site über HTTPS bereitzustellen, hat das Trennen aller Elemente über HTTPS einen zusätzlichen Overhead auf Ihrem Server. Denken Sie daran, Verschlüsselung ist nicht billig. Der geringe Overhead wirkt sich auch auf die Reaktionszeit Ihrer App aus. Man könnte argumentieren, dass Standardhardware billig und die Auswirkungen vernachlässigbar sind, aber ich schweife ab :) Ich mag die Idee nicht, große Inhalte mit Bildern usw. über https zu vermarkten. Also los geht's. Es ähnelt dem, was andere oben vorgeschlagen haben, Middleware zu verwenden, aber es ist eine vollständige Lösung, mit der Sie zwischen HTTP / HTTPS hin und her wechseln können.

Erstellen Sie zuerst eine Middleware.

php artisan make:middleware ForceSSL

So sollte Ihre Middleware aussehen.

<?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);
    }
}

Beachten Sie, dass ich nicht nach Umgebung filtere, da ich HTTPS-Setup sowohl für lokale Entwickler als auch für die Produktion habe, sodass dies nicht erforderlich ist.

Fügen Sie Ihrer routeMiddleware \ App \ Http \ Kernel.php Folgendes hinzu, damit Sie auswählen können, welche Routengruppe SSL erzwingen soll.

    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,
];

Als nächstes möchte ich zwei grundlegende Gruppen, Anmelden / Anmelden usw. und alles andere hinter der Auth-Middleware sichern.

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
});

Stellen Sie sicher, dass Ihre Middlewares von der Konsole aus ordnungsgemäß auf Ihre Routen angewendet werden.

php artisan route:list

Nachdem Sie alle Formulare oder vertraulichen Bereiche Ihrer Anwendung gesichert haben, besteht der Schlüssel darin, Ihre Ansichtsvorlage zu verwenden, um Ihre sicheren und öffentlichen (nicht https) Links zu definieren.

Basierend auf dem obigen Beispiel würden Sie Ihre sicheren Links wie folgt rendern:

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

Nicht sichere Links können als gerendert werden

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

Dadurch wird eine vollständig qualifizierte URL wie https: // yourhost / login gerendert und http: // yourhost / aboutus gerendert

Wenn Sie keine vollständig qualifizierte URL mit http rendern und eine relative Link-URL ('/ aboutus') verwenden, bleibt https bestehen, nachdem ein Benutzer eine sichere Site besucht hat.

Hoffe das hilft!

na-98
quelle
7

Was ist mit der Verwendung der .htaccess- Datei, um eine https-Umleitung zu erreichen? Dies sollte im Projektstamm (nicht im öffentlichen Ordner) abgelegt werden. Ihr Server muss so konfiguriert sein, dass er auf das Projektstammverzeichnis verweist.

<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>

Ich verwende dies für Laravel 5.4 (neueste Version zum Zeitpunkt des Schreibens dieser Antwort), aber es sollte weiterhin für Feature-Versionen funktionieren, selbst wenn Laravel einige Funktionen ändert oder entfernt.

Maulik Gangani
quelle
Chrome gibt mir einen Fehler: Zu viele Weiterleitungen. Scheint, als würde dies eine Schleife bilden
Phoenix
Hallo, ich habe die Antwort aktualisiert. Stellen Sie sicher, dass Sie diese .htaccess im Projektstammverzeichnis ablegen und Ihren Server (Apache-Konfiguration) auf das Projektstammverzeichnis verweisen.
Maulik Gangani
1
@MladenJanjetovic Sie können verschiedene htaccess-Dateien für diese Umgebungen haben
Burgi
1
@MladenJanjetovic, das es in der Anwendung hat, hat definitiv seine Vorteile, aber aus Sicht der Effizienz und Geschwindigkeit würde ich sagen, dass es vorteilhaft ist, dies in der Serverkonfiguration zu haben, damit Sie Laravel nicht nur für eine Umleitung laden müssen. Umgebungsspezifische Konfigurationen in einem einzelnen versionierten .htaccess können erreicht werden, indem eine Umschreibbedingung verwendet wird, um die Domäne zu überprüfen, etwaRewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Chris
1
Auch ich ziehe es vor, dies in .htaccess im Stammverzeichnis abzulegen, und wie Crhis sagte, können hier umgebungsspezifische Einstellungen vorgenommen werden, wenn auch etwas weniger elegant als in Mladens Lösung.
Jovan
6

Sie können RewriteRule verwenden, um ssl im selben Ordner mit Ihrer index.php zu erzwingen.
Bitte fügen Sie es als Bildanhang hinzu und fügen Sie es vor allen anderen Regeln hinzu ssl .htaccess einstellen

Quy Le
quelle
3

in IndexController.php setzen

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

        return redirect('/');
    }

    return view('index');
}

in AppServiceProvider.php setzen

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

}}

In AppServiceProvider.php wird jede Weiterleitung an die URL https gesendet, und für eine http-Anfrage müssen wir einmal umleiten, also in IndexController.php müssen wir nur einmal umleiten

Artur Qaramyan
quelle
Können Sie erklären, wie Ihre Antwort die Frage löst?
Soundslikeodd
Bitte fügen Sie diese Erklärung Ihrer Antwort hinzu.
Soundslikeodd
3

Die obigen Antworten haben bei mir nicht funktioniert, aber es scheint, dass Deniz Turan den .htaccess so umgeschrieben hat, dass er mit Herokus Load Balancer hier funktioniert: https://www.jcore.com/2017/01/29/force-https -on-heroku-using-htaccess /

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Phil
quelle
3

Ich füge diese Alternative hinzu, da ich unter diesem Problem sehr gelitten habe. Ich habe alle möglichen Methoden ausprobiert und nichts hat funktioniert. Also habe ich eine Problemumgehung dafür gefunden. Es ist vielleicht nicht die beste Lösung, aber es funktioniert -

Zu Ihrer Information, ich benutze Laravel 5.6

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

Produktion <- Es sollte durch den Wert APP_ENV in Ihrer .env-Datei ersetzt werden

thebrownkid
quelle
2

Hier erfahren Sie, wie es auf Heroku geht

Fügen Sie am Ende Ihres .htaccess in public / Folgendes hinzu, um SSL auf Ihren Prüfständen zu erzwingen, jedoch nicht lokal.

# 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]

Sie können dies auf Ihrem lokalen Computer testen mit:

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

Dadurch wird der Header X-weitergeleitet an die Form weitergeleitet, die er für Heroku annehmen wird.

dh es simuliert, wie ein Heroku-Dyno eine Anfrage sieht.

Sie erhalten diese Antwort auf Ihrem lokalen Computer:

<!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>

Das ist eine Weiterleitung. Das ist es, was Heroku einem Client zurückgeben wird, wenn Sie den .htaccess wie oben festlegen. Auf Ihrem lokalen Computer passiert dies jedoch nicht, da X-Forwarded nicht eingestellt ist (wir haben es oben mit Curl gefälscht, um zu sehen, was passiert ist).

mwal
quelle
2

Wenn Sie CloudFlare verwenden, können Sie einfach eine Seitenregel erstellen, um immer HTTPS zu verwenden: SSL Cloudflare erzwingen Dadurch wird jede http: // -Anforderung an https: // umgeleitet

Darüber hinaus müssten Sie Ihrer boot () -Funktion \ app \ Providers \ AppServiceProvider.php Folgendes hinzufügen:

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

Dies würde sicherstellen, dass jeder Link / Pfad in Ihrer App https: // anstelle von http: // verwendet.

Butaminas
quelle
2

Ein etwas anderer Ansatz, getestet in 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. Code basierend auf den Kommentaren von @ matthias-lill aktualisiert.

Zoli
quelle
1
Funktioniert auch auf Laravel 6.
Rubens
1
Die Verwendung der env () -Funktionen funktioniert nicht mit zwischengespeicherten Konfigurationsdateien. Dies sollte config('app.url')stattdessen darauf hinweisen . Außerdem verfügt Laravel über eine sehr praktische String-Funktion Str::startsWith(config('app.url'), 'https://').
Matthias Lill
1

Für Laravel 5.6 musste ich den Zustand ein wenig ändern, damit es funktioniert.

von:

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

Zu:

if (empty($_SERVER['HTTPS']) && env('APP_ENV') === 'prod') {
return redirect()->secure($request->getRequestUri());
}
Priyank
quelle
1

Das hat für mich geklappt. Ich habe einen benutzerdefinierten PHP-Code erstellt, um die Umleitung zu https zu erzwingen. Fügen Sie diesen Code einfach in die header.php ein

<?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
quelle
1

Ich verwende in Laravel 5.6.28 die nächste Middleware:

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
quelle
1

Der einfachste Weg wäre auf Anwendungsebene. In der Datei

app/Providers/AppServiceProvider.php

Fügen Sie Folgendes hinzu:

use Illuminate\Support\Facades\URL;

Fügen Sie in der boot () -Methode Folgendes hinzu:

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

Dadurch sollten alle Anforderungen auf Anwendungsebene an https umgeleitet werden.

(Hinweis: Dies wurde mit Laravel 5.5 LTS getestet.)

Pinak Saha
quelle
1

Sie können einfach zu app -> Providers -> AppServiceProvider.php gehen

füge zwei Zeilen hinzu

Verwenden Sie Illuminate \ Support \ Facades \ URL.

URL :: forceScheme ('https');

wie in den folgenden Codes gezeigt:

use Illuminate\Support\Facades\URL;

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

       // any other codes here, does not matter.
    }
Wria Mohammed
quelle
0

Diese Arbeit für mich in Laravel 7.x in 3 einfachen Schritten mit einer Middleware:

1) Generieren Sie die Middleware mit Befehl php artisan make:middleware ForceSSL

Middleware

<?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) Registrieren Sie die Middleware in der routeMiddlewareKernel-Datei

Kernel

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

3) Verwenden Sie es in Ihren Routen

Routen

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

});

Hier die vollständige Dokumentation zu Middleware

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

.HTACCESS-Methode

Wenn Sie eine .htaccessDatei bevorzugen , können Sie den folgenden Code verwenden:

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

Grüße!

Radames E. Hernandez
quelle