Redirection de HTTP vers HTTPS avec PHP

107

Je travaille sur un site Web de panier d'achat et je souhaite rediriger l'utilisateur vers une page HTTPS lorsqu'il saisit ses informations de facturation et maintenir la connexion HTTPS pour les pages suivantes jusqu'à ce qu'il se déconnecte.

Que dois-je installer sur le serveur (j'utilise Apache) pour ce faire, et comment cette redirection peut-elle être effectuée à partir de PHP?

Psyché
la source

Réponses:

247

Essayez quelque chose comme ceci (devrait fonctionner pour Apache et IIS):

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
la source
5
Ça ne marche pas toujours. J'ai essayé de l'utiliser et il n'y avait pas d'élément 'https' dans le tableau $ _SERVER en raison duquel il donnait une erreur de 'trop de redirections'. Aurait besoin d'utiliser une autre méthode.
Usman Zaheer
5
J'ai dû tester if( $_SERVER['HTTPS'] == "off")pour que ce code fonctionne. Je pense que c'est parce que je suis sur IIS, pas Apache comme l'OP.
Nick Pickering
1
@NicholasPickering Jepp, les variables $ _SERVER peuvent varier selon les serveurs Web.
Raphael Michel
6
Remarque: die () ou exit () peuvent être importants à mettre après les redirections d'en-tête pour empêcher le reste de la page de s'exécuter (et éventuellement d'envoyer des informations supplémentaires au client) (c'est-à-dire aux pirates ou navigateurs qui peuvent ne pas respecter l'en-tête).
jour du
3
Selon l'environnement / la configuration de votre serveur, vous devrez peut-être utiliser $ _SERVER ['HTTP_X_FORWARDED_PROTO'] pour rechercher http / https
David Meister
19

C'est une bonne façon de le faire:

<?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
la source
1
fonctionne bien celui marqué comme bon renverra une redirection trop souvent au moins dans Chrome
Thomas J Younsi
La condition !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'sera toujours fausse, car si la dernière partie est vraie, la première sera fausse.
Max
@Max: Je ne comprends pas ce que vous dites. Si la deuxième condition est vraie ($ _SERVER ['HTTPS'] == 'on') alors la première condition devra être VRAI également (bien sûr, cette variable serveur est définie, car elle contient une valeur!)
OMA
7

Redirection de HTTP vers HTTPS avec PHP sur IIS

J'avais du mal à obtenir la redirection vers HTTPS pour travailler sur un serveur Windows qui exécute la version 6 de MS Internet Information Services (IIS) . Je suis plus habitué à travailler avec Apache sur un hôte Linux, alors je me suis tourné vers Internet pour obtenir de l'aide et c'était la question la plus élevée de Stack Overflow lorsque j'ai recherché «php redirect http to https» . Cependant, la réponse choisie n'a pas fonctionné pour moi.

Après quelques essais et erreurs, j'ai découvert qu'avec IIS, $_SERVER['HTTPS']est défini sur offpour les connexions non TLS. J'ai pensé que le code suivant devrait aider tous les autres utilisateurs d'IIS qui viennent à cette question via le moteur de recherche.

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

Edit : À partir d'une autre réponse de Stack Overflow , une solution plus simple consiste à vérifier if($_SERVER["HTTPS"] != "on").

Anthony Geoghegan
la source
13
@JakeSylvestre D'accord. Étant donné que cette question n'est pas étiquetée comme apache, j'ai publié cette réponse au profit d'autres utilisateurs IIS (similaire à la situation dans laquelle je me trouvais) qui pourraient rencontrer cette page via le moteur de recherche. Je souscris à l'idée que les réponses sont dans l'intérêt de la communauté dans son ensemble et pas seulement du PO.
Anthony Geoghegan
6

Vous pouvez toujours utiliser

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

pour rediriger vers l'URL de sauvegarde.

Mais je recommanderais de le faire par .htaccess et les règles de réécriture Apache.

Powtac
la source
13
Je recommanderais toujours de vérifier $ _SERVER ['HTTPS'] avant de rediriger.
Raphael Michel
$ _SERVER ['HTTPS'] n'est pas toujours défini, mais c'est une bonne idée de vérifier avant. C'est pourquoi je recommande de le faire avec une règle de réécriture utile dans Apache, qui ne redirige que lorsqu'il n'est pas sur HTTPS.
powtac
Bien qu'Apache recommande de ne pas utiliser de fichier .htaccess supplémentaire (car il ralentit) mais d'utiliser les règles de réécriture dans le * .conf d'Apache.
powtac
1

Sur mon serveur AWS beanstalk, je ne vois pas la variable $ _SERVER ['HTTPS']. Je vois $ _SERVER ['HTTP_X_FORWARDED_PROTO'] qui peut être soit 'http' ou 'https', donc si vous hébergez sur AWS, utilisez ceci:

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
la source