Umleiten von HTTP zu HTTPS mit PHP

107

Ich arbeite an einer Warenkorb-Website und möchte den Benutzer auf eine HTTPS-Seite umleiten, wenn er seine Rechnungsdetails eingibt, und die HTTPS-Verbindung für die nächsten Seiten beibehalten, bis er sich abmeldet.

Was muss ich auf dem Server installieren (ich verwende Apache), um dies zu tun, und wie kann diese Umleitung von PHP aus erfolgen?

Psyche
quelle

Antworten:

246

Versuchen Sie so etwas (sollte für Apache und IIS funktionieren):

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Raphael Michel
quelle
5
Es funktioniert nicht immer. Ich habe versucht, es zu verwenden, und es gab kein 'https'-Element im $ _SERVER-Array, aufgrund dessen der Fehler' zu viele Weiterleitungen 'ausgegeben wurde. Müsste andere Methode verwenden.
Usman Zaheer
5
Ich musste testen if( $_SERVER['HTTPS'] == "off"), damit dieser Code funktioniert. Ich denke, das liegt daran, dass ich auf IIS bin und nicht auf Apache wie das OP.
Nick Pickering
1
@NicholasPickering Jepp, $ _SERVER-Variablen können je nach Webserver variieren.
Raphael Michel
6
Hinweis: Die () oder exit () kann wichtig sein, um nach Header-Umleitungen zu setzen, um zu verhindern, dass der Rest der Seite ausgeführt wird (und möglicherweise zusätzliche Informationen an den Client gesendet werden) (dh an Hacker oder Browser, die den Header möglicherweise nicht respektieren).
Dajon
3
Abhängig von Ihrer Serverumgebung / Einrichtung müssen Sie möglicherweise $ _SERVER ['HTTP_X_FORWARDED_PROTO'] verwenden, um um
David Meister am
19

Dies ist ein guter Weg, um es zu tun:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>
Matiasg1982
quelle
1
funktioniert gut Der als gut gekennzeichnete wird zumindest in Chrome zu oft eine Weiterleitung zurückgeben
Thomas J Younsi
Die Bedingung !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'ist immer falsch, denn wenn der letzte Teil wahr ist, ist der erste falsch.
Max
@ Max: Ich verstehe nicht, was du sagst. Wenn die zweite Bedingung erfüllt ist ($ _SERVER ['HTTPS'] == 'on'), muss die erste Bedingung ebenfalls TRUE sein (natürlich ist diese Servervariable gesetzt, da sie einen Wert enthält!)
OMA
7

Umleiten von HTTP zu HTTPS mit PHP unter IIS

Ich hatte Probleme, die Umleitung zu HTTPS auf einem Windows-Server durchzuführen, auf dem Version 6 von MS Internet Information Services (IIS) ausgeführt wird . Ich bin eher daran gewöhnt, mit Apache auf einem Linux-Host zu arbeiten, daher habe ich mich an das Internet gewandt, um Hilfe zu erhalten. Dies war die am höchsten bewertete Frage zum Stapelüberlauf, als ich nach "PHP Redirect http to https" suchte . Die ausgewählte Antwort hat bei mir jedoch nicht funktioniert.

Nach einiger Versuch und Irrtum, entdeckte ich , dass mit IIS, $_SERVER['HTTPS']eingestellt wird offfür Verbindungen nicht-TLS. Ich dachte, der folgende Code sollte allen anderen IIS-Benutzern helfen, die über eine Suchmaschine zu dieser Frage kommen.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

Bearbeiten : Aus einer anderen Antwort zum Stapelüberlauf besteht eine einfachere Lösung darin, dies zu überprüfen if($_SERVER["HTTPS"] != "on").

Anthony Geoghegan
quelle
13
@ JakeSylvestre Fair genug. Da diese Frage nicht als gekennzeichnet ist apache, habe ich diese Antwort zum Nutzen anderer IIS-Benutzer (ähnlich der Situation, in der ich mich befand) veröffentlicht, die möglicherweise über eine Suchmaschine auf diese Seite stoßen. Ich stimme der Ansicht zu, dass Antworten zum Nutzen der gesamten Gemeinschaft und nicht nur des OP sind.
Anthony Geoghegan
6

Sie können immer verwenden

header('Location: https://www.domain.com/cart_save/');

um zur gespeicherten URL umzuleiten.

Aber ich würde empfehlen, dies mit .htaccess und den Apache-Umschreiberegeln zu tun.

powtac
quelle
13
Ich würde immer empfehlen, $ _SERVER ['HTTPS'] zu überprüfen, bevor Sie umleiten.
Raphael Michel
$ _SERVER ['HTTPS'] ist nicht immer festgelegt, es ist jedoch eine gute Idee, dies vorher zu überprüfen. Aus diesem Grund empfehle ich, dies mit einer nützlichen Umschreiberegel in Apache zu tun, die nur umleitet, wenn sie nicht unter HTTPS ausgeführt wird.
Powtac
Obwohl Apache empfiehlt, keine zusätzliche .htaccess-Datei zu verwenden (da diese langsamer wird), sondern die Umschreiberegeln in der * .conf von Apache zu verwenden.
Powtac
1

Auf meinem AWS-Beanstalk-Server wird die Variable $ _SERVER ['HTTPS'] nicht angezeigt. Ich sehe $ _SERVER ['HTTP_X_FORWARDED_PROTO'], das entweder 'http' oder 'https' sein kann. Wenn Sie also auf AWS hosten, verwenden Sie Folgendes:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Phönix
quelle