Montag, 31. Juli 2006

PHP

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

Download Code!

  1.  
  2. function httpsRedirect() {
  3.         // Wenn es schon https ist, verlasse die Funktion
  4.         // if(isset($_SERVER['HTTPS'])) return; // Old, fixed by Dirk
  5.         if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == '1' || strtolower($_SERVER['HTTPS'])=='on')) return;
  6.        
  7.         // Url zusammenbauen
  8.         $url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
  9.        
  10.         // Wenn die URL Parameter hat, werden diese angehängt
  11.         if(!empty($_SERVER['QUERY_STRING'])) {
  12.                 $url .= '?'.$_SERVER['QUERY_STRING'];
  13.         }
  14.         // Wenn noch keine Ausgabe erfolgt ist, leiten wir um
  15.         if(!headers_sent()) header('Location: '.$url);
  16.        
  17. }
  18.  

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.
Bewertung: keine, 0 Stimme(n) 4753 Klicks
PHP
Von Mr.Foo in PHP am 31.07.06@12:27 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

16 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Maga-B - #1 - 22.06.2007 10:53 - (Antwort)

schöne Idee - funzt nur leider nich...

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

Tom - #2 - 08.03.2008 13:05 - (Antwort)

Super danke - genau das was ich gesucht habe...

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:

Download Code!

  1.  
  2. function httpsRedirect() {
  3.         // Wenn es schon https ist, verlasse die Funktion
  4.         // if(isset($_SERVER['HTTPS'])) return; // Old, fixed by Dirk
  5.         if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == '1' || strtolower($_SERVER['HTTPS'])=='on')) return;
  6.        
  7.         // Url zusammenbauen
  8.         $url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
  9.        
  10.         // Wenn die URL Parameter hat, werden diese angehängt
  11.         if(!empty($_SERVER['QUERY_STRING'])) {
  12.                 $url .= '?'.$_SERVER['QUERY_STRING'];
  13.         }
  14.         // Wenn noch keine Ausgabe erfolgt ist, leiten wir um
  15.         if(!headers_sent()) header('Location: '.$url);
  16.        
  17. }
  18. function httpsRedirect();
  19.  


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


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Automatische Weiterleitung mit PHP von HTTP nach HTTPS

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen