Montag, 31. Juli 2006
Automatische Weiterleitung mit PHP von HTTP nach HTTPS
HTTP, das Protokoll das verwendet wird um beispielsweise diese Webseite hier anzuzeigen, hat einen gravierenden Nachteil. Es sendet alle Daten im Klartext. Das kann bei sensitiven Informationen wie Passwörtern kritisch werden, da diese im Prinzip für jeden lesbar übertragen werden. Aber es gibt noch HTTPS, dass ist eine feine Sache. Es verschlüsselt die Verbindung und macht somit die Nachteile von HTTP wett...
Sichere Verbindung mit HTTPS
Eine PHP Applikation die ich entwickelt habe, ist nun vom Intranet in das Internet verlegt worden. Leider sind die Möglichkeiten hier beschränkter, als im Intranet. Der Server ist nämlich ein Managed Server – also jemand anderes administriert ihn. Somit habe ich auf wichtige Einstellungen keinen Einfluss mehr.
Da aber die Applikation unbedingt unter mit dem HTTPS Protokoll laufen soll und ich wie gesagt viele Einstellungen nicht setzen kann, muss ich mir mit ein wenig mit PHP aushelfen. Ich habe das Stückchen Code zu Hause mal ein wenig umgeschrieben und ein wenig universeller gemacht, so dass ihr es auch nutzen könnt. Den PHP-Code könnt ihr in Listing 1 sehen.
HTTPS in den PHP-Superglobals
Es macht sich eine Eigenschaft der Superglobalen Servervariablen $_SERVER zunutze. Diese Superglobale ist ein Array und enthält den Schlüssel HTTPS, also $_SERVER['HTTPS'], wenn das Protokoll HTTPS ist.
Die von mir erstellte Funktion, prüft nun ob das HTTPS-Protokoll verwendet wird, wenn ja verlässt es die Funktion und wenn es nicht benutzt wird, baut es die URL inklusive der Parameter wieder zusammen. Wenn nun noch keine Ausgabe erfolgt ist, beispielsweise durch ein echo, dann wird mit hilfe der PHP-Funktion header, auf die ursprüngliche URL weitergeleitet.
Mit dem Unterschied, dass diesmal das HTTPS Protokoll verwendet wird. Deshalb solltet ihr die Funktion unbedingt im Kopf eurer PHP-Datei einbinden. Möglicherweise gibt es eine elegantere Lösung, nein ich meine jetzt nicht einen Eintrag in der vhost.conf, oder vielleicht mit einer Rewrite-Regel für den mod_rewrite des Apachen.
Listing 1
- function httpsRedirect() {
- // Wenn es schon https ist, verlasse die Funktion
- // if(isset($_SERVER['HTTPS'])) return; // Old, fixed by Dirk
- if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == '1' || strtolower($_SERVER['HTTPS'])=='on')) return;
- // Url zusammenbauen
- $url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
- // Wenn die URL Parameter hat, werden diese angehängt
- $url .= '?'.$_SERVER['QUERY_STRING'];
- }
- // Wenn noch keine Ausgabe erfolgt ist, leiten wir um
- }
Update
Dirk ist aufgefallen, dass das Script einen kleinen Schönheitsfehler hatte und somit auf einem IIS nicht funktioniert. Dazu auch einen Auszug aus der PHP-Dokumentation:
Dieser Eintrag ist gesetzt wenn der Zugriff auf das Script über das HTTPS Protokoll erfolgte. protocol. Wenn das ISAPI des IIS genutzt wird so ist diese Variable auch bei nicht-HTTPS Zugriffen gesetzt und enthält in diesem Fall den Wert off.
Mr. Foo - #1.1 - 22.06.2007 11:09 - (Antwort)
Hallo Maga-B ![]()
Definiere mal das etwas genauer. Mit "Funzt leider nich" kann man den Fehler schwer lokalisieren.
Oliver Becker - McDubs Networks - #1.2 - 29.11.2007 08:22 - (Antwort)
Funktioniert einwandfrei!
http://www.McDubs.net?pid=10-624-800 wird umgeleitet auf httpS://www.McDubs.net?pid=10-624-800.
Vielen Dank.
Gruß, Oliver Becker
Dirk Weise - #3 - 28.04.2008 02:31 - (Antwort)
Eine Fehlerquelle ist, daß Deine Prüfung ob $_SERVER['https'] gesetzt ist, nicht ausreichend ist, da hier je nach Betriebssystem unterschiedliche Werte angenommen werden können (IIS benutzt z.B. auch "Off").
Prüfe besser mit folgendem Ausdruck
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == '1' || strtolower($_SERVER['HTTPS'])=='on')) return;
Schöne Grüße
dirk
Mr.Foo - #3.1 - 05.05.2008 20:42 - (Antwort)
Hmm,
okay nach dem schmökern in den Tiefen der PHP-Dokumentation muss ich sagen, vielen Dank für den Hinweis - habe es jetzt verbessert.
Snick - #3.1.1 - 18.02.2009 14:55 - (Antwort)
Danke für das Script.
Das einzige Problem von mir ist, ich weiss jetzt nicht, wie ich das ganze in meine Website integriere. Wenn ich dein Code 1:1 in den ersten teil meiner PHP datei setze, passiert überhaupt nichts.
Muss ich die Funktion httpsRedirect jetzt mit irgend welchen parametern aufrufen?
Danke für die Hilfe ![]()
Mr. Foo - #3.1.1.1 - 18.02.2009 15:47 - (Antwort)
Hallo Snick,
die Weiterleitung führst du einfach mit:
httpsRedirect();
aus - ohne Parameter.
Snick - #3.1.1.1.1 - 18.02.2009 16:08 - (Antwort)
Danke für die schnelle Antwort. Entschuldige mich jetzt schon für den langen text ![]()
bei mir scheint es immer noch nicht zu klappen.
Habe eine neue PHP Datei erstellt
Linie 21
Ich bekomme bei Variante 1 folgenden Fehler
Parse error: syntax error, unexpected ';', expecting '{' in https.force.php on line 21
Variante 2:
Parse error: syntax error, unexpected ';', expecting '{' in https.force.php on line 19
Das problem ist, dass ich keinen Fehler in deiner Syntax erkennen kann ![]()
Daher meine Frage, wo der Fehler sein könnte
-->habe es auf 2 Webservern getestet. Ist jeweils die neuste Version von xampp
Mr. Foo - #3.1.1.1.1.1 - 18.02.2009 16:24 - (Antwort)
Brauchst dich nicht entschuldigen - ich helfe gerne ![]()
Poste mal bitte deinen Quellcode der https.force.php hier, dann schau ich mal.
Snick - #3.1.1.1.1.1.1 - 20.02.2009 08:24 - (Antwort)
Quellcode:
- function httpsRedirect() {
- // Wenn es schon https ist, verlasse die Funktion
- // if(isset($_SERVER['HTTPS'])) return; // Old, fixed by Dirk
- if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == '1' || strtolower($_SERVER['HTTPS'])=='on')) return;
- // Url zusammenbauen
- $url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
- // Wenn die URL Parameter hat, werden diese angehängt
- $url .= '?'.$_SERVER['QUERY_STRING'];
- }
- // Wenn noch keine Ausgabe erfolgt ist, leiten wir um
- }
- function httpsRedirect();
Danke dir für die schnelle Hilfe
Mr. Foo - #3.1.1.1.1.1.1.1 - 20.02.2009 11:14 - (Antwort)
Das Problem ist in Zeile 18. Wenn du eine Funktion ausführen willst, musst du das ohne das function davor machen.
Snick - #3.1.1.1.1.1.1.1.1 - 26.02.2009 10:21 - (Antwort)
Vielen Dank für die Hilfe.
Jetzt ist mir auch klar, was ich falsch gemacht habe. Sorry, habe noch nie mit Funktionen gearbetet.
Mr. Foo - #3.1.1.1.1.1.1.1.1.1 - 02.03.2009 19:55 - (Antwort)
Kein Problem ![]()
Freut mich, wenn ich helfen konnte.
amimoto - #4 - 24.09.2010 14:23 - (Antwort)
Vielen Dank, funzt super und war mir gerade eine große Hilfe!!
yeti18 - #5 - 06.03.2012 22:53 - (Antwort)
vielen vielen Dank!!!!!!!
Hatte bisher immer ein Redirect aus meinem http-Pfad auf den https-Pfad gemacht. Dies ging seit einer Umstellung der Verwaltungssoftware (auf plesk10.4.4) nicht mehr. Man kann nur ein Domain-Pfad angeben. Jetzt gehts - wunderbar ![]()
