Ich habe viele Online-Tutorials gesehen, die besagen, dass Sie überprüfen müssen, $_SERVER['HTTPS']
ob die Verbindung des Servers mit HTTPS gesichert ist. Mein Problem ist, dass auf einigen der von mir verwendeten Server $_SERVER['HTTPS']
eine undefinierte Variable ist, die zu einem Fehler führt. Gibt es eine andere Variable, die ich überprüfen kann und die immer definiert werden sollte?
Um ganz klar zu sein, ich verwende derzeit diesen Code, um zu beheben, ob es sich um eine HTTPS-Verbindung handelt:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
Secure
Cookies. Sei aber vorsichtig mit den Fallstricken.Antworten:
Dies sollte immer funktionieren, auch wenn
$_SERVER['HTTPS']
es nicht definiert ist:Der Code ist mit IIS kompatibel.
Aus der PHP.net-Dokumentation und den Benutzerkommentaren :
Außerdem haben Apache 1.x-Server (und fehlerhafte Installationen) möglicherweise keine
$_SERVER['HTTPS']
Definition, selbst wenn eine sichere Verbindung besteht. Obwohl nicht garantiert, verwenden Verbindungen an Port 443 gemäß Konvention wahrscheinlich sichere Sockets , daher die zusätzliche Portprüfung.Zusätzlicher Hinweis: Wenn zwischen dem Client und Ihrem Server ein Load Balancer besteht, testet dieser Code nicht die Verbindung zwischen dem Client und dem Load Balancer, sondern die Verbindung zwischen dem Load Balancer und Ihrem Server. Um die frühere Verbindung zu testen, müssten Sie den
HTTP_X_FORWARDED_PROTO
Header testen , dies ist jedoch viel komplexer. Siehe die neuesten Kommentare unter dieser Antwort.quelle
getservbyname()
ist nur eine Referenz, keine Realität und garantiert in keiner Weise, dass HTTPS über Port 443 ausgeführt wird.$_SERVER['SERVER_PORT'] !== 443
ich$_SERVER['SERVER_PORT]
auf eine ganze Zahl wieintval($_SERVER['SERVER_PORT]) !== 443
strtolower($_SERVER['HTTPS']) !== 'off'
hat den Trick gemacht.Meine Lösung (da die Standardbedingungen [$ _SERVER ['HTTPS'] == 'on'] auf Servern hinter einem Load Balancer nicht funktionieren) lautet:
HTTP_X_FORWARDED_PROTO: Ein De-facto- Standard zum Identifizieren des Ursprungsprotokolls einer HTTP-Anforderung, da ein Reverse-Proxy (Load Balancer) über HTTP mit einem Webserver kommunizieren kann, selbst wenn die Anforderung an den Reverse-Proxy HTTPS http: //en.wikipedia lautet . org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers
quelle
Chacha, laut PHP-Dokumentation: "Auf einen nicht leeren Wert setzen, wenn das Skript über das HTTPS-Protokoll abgefragt wurde." Ihre if-Anweisung dort wird also in vielen Fällen, in denen HTTPS tatsächlich aktiviert ist, false zurückgeben. Sie möchten überprüfen, ob
$_SERVER['HTTPS']
vorhanden und nicht leer ist. In Fällen, in denen HTTPS für einen bestimmten Server nicht richtig eingestellt ist, können Sie versuchen, zu überprüfen, ob$_SERVER['SERVER_PORT'] == 443
.Beachten Sie jedoch, dass einige Server auch
$_SERVER['HTTPS']
einen nicht leeren Wert festlegen. Überprüfen Sie daher auch diese Variable.Referenz: Dokumentation für
$_SERVER
und$HTTP_SERVER_VARS
[veraltet]quelle
HTTP_X_FORWARDED_PROTO
oderHTTP_X_FORWARDED_SSL
auch.(((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')))
Portcheck ist überhaupt nicht enthalten. Fühlen Sie sich frei hinzuzufügen. :-)SetEnvIf X-Forwarded-SSL on HTTPS=on
wird den Trick machen. Aber dies wird nicht funktionieren,REQUEST_SCHEME
da PHP besser zu verwenden scheint$_SERVER['HTTPS']
Dies funktioniert auch, wenn
$_SERVER['HTTPS']
es nicht definiert istquelle
$_SERVER['HTTPS']
noch kein https aktiviert ist. Wie wär es damit ?SERVER_PORT
ist immer definiert, die das undefinierte Problem vonHTTPS
Ich hatte gerade ein Problem, bei dem ich den Server mit Apache mod_ssl ausführte, aber ein phpinfo () und ein var_dump ($ _SERVER) zeigten, dass PHP immer noch glaubt, ich sei auf Port 80.
Hier ist meine Problemumgehung für alle, die das gleiche Problem haben ...
Die erwähnenswerte Zeile ist die SetEnv-Zeile. Wenn dies vorhanden ist und Sie nach einem Neustart die HTTPS-Umgebungsvariable haben, von der Sie immer geträumt haben
quelle
Ich mache meine eigene Funktion, indem ich alle vorherigen Beiträge lese:
quelle
Wenn Sie Apache verwenden, können Sie sich immer darauf verlassen
um das Schema der angeforderten URL zu überprüfen. Wie in anderen Antworten erwähnt, ist es jedoch ratsam, andere Parameter zu überprüfen, bevor davon ausgegangen wird, dass SSL tatsächlich verwendet wird.
quelle
Die WIRKLICHE Antwort: Bereit zum Kopieren und Einfügen in ein [Konfigurations] -Skript
$pv_URIprotocol
ist jetzt korrekt und einsatzbereit; Beispiel$site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]
. Natürlich könnte die Zeichenfolge auch durch TRUE und FALSE ersetzt werden. PV steht für PortalPress Variable, da es sich um ein direktes Kopieren und Einfügen handelt, das immer funktioniert. Dieses Stück kann in einem Produktionsskript verwendet werden.quelle
Ich denke nicht, dass das Hinzufügen eines Ports eine gute Idee ist - besonders wenn Sie viele Server mit unterschiedlichen Builds haben. das fügt nur noch eine Sache hinzu, an die man sich erinnern muss, um sich zu ändern. Wenn ich mir die Dokumente ansehe, denke ich, dass die letzte Reihe von Kaisern ziemlich gut ist, so dass:
scheint perfekt genug.
quelle
Die einzig verlässliche Methode ist die von Igor M. beschriebene.
Beachten Sie Folgendes: Sie verwenden nginx mit fastcgi. Standardmäßig (debian, ubuntu) enthalten fastgi_params Direktiven:
fastcgi_param HTTPS $ https;
Wenn Sie NICHT SSL verwenden, wird es als leerer Wert übersetzt, nicht als "Aus", nicht als 0, und Sie sind zum Scheitern verurteilt.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
quelle
Ich finde diese Parameter ebenfalls akzeptabel und habe beim Wechseln von Webservern höchstwahrscheinlich keine Fehlalarme.
$ _SERVER ['HTTPS_SERVER_SUBJECT']
quelle
Der kürzeste Weg, den ich benutze:
Wenn https verwendet wird, ist $ secure_connection true.
quelle
echo (!empty($_SERVER['HTTPS'])?'https':'http');
gibt Ihnenhttp
oderhttps
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Sie können überprüfen, ob
$_SERVER['SERVER_PORT']
SSL normalerweise auf Port 443 ausgeführt wird, dies ist jedoch nicht kinderleicht.quelle
Was denkst du über dies?
quelle
Auf meinem Server (Ubuntu 14.10, Apache 2.4, PHP 5.5) ist die Variable
$_SERVER['HTTPS']
nicht festgelegt, wenn das PHP-Skript über https geladen wird. Ich weiß nicht, was los ist. Die folgenden Zeilen in der.htaccess
Datei beheben dieses Problem:quelle
Hier ist eine wiederverwendbare Funktion, die ich seit einiger Zeit benutze. HTH.
Hinweis: Der Wert von HTTPS_PORT (eine benutzerdefinierte Konstante in meinem Code) kann je nach Umgebung variieren, z. B. 443 oder 81.
quelle
Nur aus Interesse sendet Chromkanarienvogel im Moment
Je nachdem, wie der Server konfiguriert ist, kann dies bedeuten, dass Sie Folgendes zurückerhalten
Dies hat unsere Anwendung beschädigt, weil wir getestet haben, ob sie aktiviert ist, was offensichtlich nicht der Fall ist. Im Moment scheint dies nur Chromkanarienvogel zu tun, aber es ist erwähnenswert, dass Kanariensachen kurze Zeit später im Allgemeinen in "normalem" Chrom landen.
quelle
Wenn Sie nginx als Lastausgleichssystem verwenden, überprüfen Sie $ _SERVER ['HTTP_HTTPS'] == 1 andere Überprüfungen schlagen für ssl fehl.
quelle
Code überprüft alles Mögliche und funktioniert auch auf dem IIS-Webserver. Chrome seit v44 setzt den Header HTTP: 1 nicht, daher ist die Überprüfung von HTTP_HTTPS in Ordnung. Wenn dieser Code nicht mit https übereinstimmt, bedeutet dies, dass Ihr Webserver oder Proxyserver schlecht konfiguriert ist. Apache selbst setzt das HTTPS-Flag korrekt, es kann jedoch zu Problemen kommen, wenn Sie einen Proxy verwenden (z. B. Nginx). Sie müssen einen Header im virtuellen Host von nginx https festlegen
Verwenden Sie ein Apache-Modul, um das HTTPS-Flag korrekt zu setzen, indem Sie vom Proxy aus nach X-HTTPS suchen. Suche nach mod_fakessl, mod_rpaf usw.
quelle
Wenn Sie den Load Balancer von Incapsula verwenden, müssen Sie eine IRule verwenden, um einen benutzerdefinierten Header für Ihren Server zu generieren. Ich habe einen HTTP_X_FORWARDED_PROTO-Header erstellt, der entweder "http" entspricht, wenn der Port auf 80 gesetzt ist, und "https", wenn er 443 entspricht.
quelle
Ich würde einen globalen Filter hinzufügen, um sicherzustellen, dass alles, was ich überprüfe, korrekt ist.
quelle
Ich habe Gelegenheit, noch einen Schritt weiter zu gehen und festzustellen, ob die Site, zu der ich eine Verbindung herstelle, SSL-fähig ist (ein Projekt fragt den Benutzer nach seiner URL und wir müssen überprüfen, ob er unser API-Paket auf einer http- oder https-Site installiert hat).
Hier ist die Funktion, die ich benutze - im Grunde rufe einfach die URL über cURL auf, um zu sehen, ob https funktioniert!
Dies ist der zuverlässigste Weg, den ich gefunden habe, um nicht nur herauszufinden, ob Sie https verwenden (wie in der Frage gestellt), sondern auch, ob Sie https verwenden KÖNNEN (oder sogar SOLLTEN).
HINWEIS: Es ist möglich (obwohl nicht sehr wahrscheinlich ...), dass eine Site unterschiedliche http- und https-Seiten hat (wenn Sie also aufgefordert werden, http zu verwenden, müssen Sie möglicherweise keine Änderungen vornehmen ..). Die überwiegende Mehrheit der Sites sind die gleichen und sollten Sie wahrscheinlich selbst umleiten, aber diese zusätzliche Überprüfung hat ihre Verwendung (sicherlich, wie gesagt, in dem Projekt, in dem der Benutzer seine Site-Informationen eingibt und Sie dies von der Serverseite aus sicherstellen möchten).
quelle
So finde ich das zu lösen
quelle
Ich habe den Hauptvorschlag hier verwendet und mich über den "PHP-Hinweis" in den Protokollen geärgert, als HTTPS nicht eingestellt war. Sie können dies vermeiden, indem Sie den Null-Koaleszenz-Operator "??" verwenden:
(Hinweis: nicht verfügbar vor PHP v7)
quelle
Gemäß dem Beitrag von hobodave: "Auf einen nicht leeren Wert setzen, wenn das Skript über das HTTPS-Protokoll abgefragt wurde."
quelle
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')