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.
php
laravel
laravel-routing
laravel-5
NightMICU
quelle
quelle
$_SERVER['HTTP_HOST']
Antworten:
Sie können dafür sorgen, dass es mit einer Middleware-Klasse funktioniert. Lassen Sie mich Ihnen eine Idee geben.
Wenden Sie diese Middleware dann auf jede Anforderung an, indem Sie die Regel in der
Kernel.php
Datei wie folgt festlegen :Im obigen Beispiel leitet die Middleware jede Anforderung an https um, wenn:
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 Link
Vorschlags 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 ...... 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
web
Gruppe hinzufügen inkernel.php file
:Bearbeiten 23/08/2018 - Laravel v5.7
App::environment() === 'production'
. Für die Vorgängerversion warenv('APP_ENV') === 'production'
.\URL::forceScheme('https');
leitet eigentlich nicht um. Es werden nur Links erstellt,https://
sobald die Website gerendert ist.quelle
$request->setTrustedProxies( [ $request->getClientIp() ] );
, dass Sie den von CloudFlare gesendeten Headern vertrauen sollen. Dadurch wird die Umleitungsschleife gestoppt.return redirect()->secure($request->getRequestUri(), 301);
$request->server('HTTP_X_FORWARDED_PROTO') != 'https'
funktioniert dies für michEine andere Option, die für mich funktioniert hat, ist, dass AppServiceProvider diesen Code in die Startmethode einfügt:
Die vor forceSchema ('https') geschriebene Funktion war falsch, ihr forceScheme
quelle
\URL::forceScheme('https');
if($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
\URL::forceScheme('https')
Wenn Sie Apache verwenden, können Sie alternativ die
.htaccess
Datei verwenden, um Ihre URLs zur Verwendung deshttps
Präfixes zu zwingen. Auf Laravel 5.4 habe ich die folgenden Zeilen zu meiner.htaccess
Datei hinzugefügt und es hat bei mir funktioniert.quelle
RewriteCond %{HTTP_HOST} !=localhost
auf dev verwenden, um dies zu umgehen .Verwenden Sie für Laravel 5.4 dieses Format, um eine https-Umleitung anstelle von .htaccess zu erhalten
quelle
Ähnlich wie Manix 'Antwort, aber an einem Ort. Middleware zum Erzwingen von HTTPS
quelle
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.
So sollte Ihre Middleware aussehen.
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.
Als nächstes möchte ich zwei grundlegende Gruppen, Anmelden / Anmelden usw. und alles andere hinter der Auth-Middleware sichern.
Stellen Sie sicher, dass Ihre Middlewares von der Konsole aus ordnungsgemäß auf Ihre Routen angewendet werden.
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:
Nicht sichere Links können als gerendert werden
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!
quelle
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.
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.
quelle
RewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
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
quelle
in IndexController.php setzen
in AppServiceProvider.php setzen
}}
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
quelle
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 /
quelle
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 -
Produktion <- Es sollte durch den Wert APP_ENV in Ihrer .env-Datei ersetzt werden
quelle
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.
Sie können dies auf Ihrem lokalen Computer testen mit:
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:
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).
quelle
Wenn Sie CloudFlare verwenden, können Sie einfach eine Seitenregel erstellen, um immer HTTPS zu verwenden: Dadurch wird jede http: // -Anforderung an https: // umgeleitet
Darüber hinaus müssten Sie Ihrer boot () -Funktion \ app \ Providers \ AppServiceProvider.php Folgendes hinzufügen:
Dies würde sicherstellen, dass jeder Link / Pfad in Ihrer App https: // anstelle von http: // verwendet.
quelle
Ein etwas anderer Ansatz, getestet in Laravel 5.7
PS. Code basierend auf den Kommentaren von @ matthias-lill aktualisiert.
quelle
config('app.url')
stattdessen darauf hinweisen . Außerdem verfügt Laravel über eine sehr praktische String-FunktionStr::startsWith(config('app.url'), 'https://')
.Für Laravel 5.6 musste ich den Zustand ein wenig ändern, damit es funktioniert.
von:
Zu:
quelle
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
quelle
Ich verwende in Laravel 5.6.28 die nächste Middleware:
quelle
Der einfachste Weg wäre auf Anwendungsebene. In der Datei
Fügen Sie Folgendes hinzu:
Fügen Sie in der boot () -Methode Folgendes hinzu:
Dadurch sollten alle Anforderungen auf Anwendungsebene an https umgeleitet werden.
(Hinweis: Dies wurde mit Laravel 5.5 LTS getestet.)
quelle
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:
quelle
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
2) Registrieren Sie die Middleware in der
routeMiddleware
Kernel-DateiKernel
3) Verwenden Sie es in Ihren Routen
Routen
Hier die vollständige Dokumentation zu Middleware
========================
.HTACCESS-Methode
Wenn Sie eine
.htaccess
Datei bevorzugen , können Sie den folgenden Code verwenden:Grüße!
quelle