144 votes

Comment puis-je obliger les utilisateurs à accéder à ma page via HTTPS au lieu de HTTP ?

J'ai une seule page que je veux forcer à être accédée en tant que page HTTPS (PHP sur Apache). Comment puis-je le faire sans obliger l'ensemble du répertoire à être en HTTPS ? Ou, si vous soumettez un formulaire à une page HTTPS à partir d'une page HTTP, l'envoi se fait-il par HTTPS au lieu de HTTP ?

Voici mon exemple :

http://www.example.com/some-page.php

Je veux qu'on y accède uniquement par :

https://www.example.com/some-page.php

Bien sûr, je peux faire pointer tous les liens vers cette page vers la version HTTPS, mais cela n'empêche pas un imbécile d'y accéder volontairement par HTTP...

J'ai notamment pensé à mettre une redirection dans l'en-tête du fichier PHP pour vérifier qu'ils accèdent bien à la version HTTPS :

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

Mais ça ne peut pas être le bon chemin, n'est-ce pas ?

186voto

Adam Rosenfield Points 176408

La façon dont je l'ai fait avant est fondamentalement comme ce que vous avez écrit, mais n'a pas de valeurs codées en dur :

if($\_SERVER\["HTTPS"\] != "on")
{
    header("Location: https://" . $\_SERVER\["HTTP\_HOST"\] . $\_SERVER\["REQUEST\_URI"\]);
    exit();
}

46voto

thebigjc Points 391

Vous pouvez le faire avec une directive et mod_rewrite sur Apache :

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Location>

Vous pouvez rendre la localisation plus intelligente au fil du temps en utilisant les éléments suivants expressions régulières si vous voulez.

44voto

Jacob Swartwood Points 3994

Vous devez forcer le client pour demander HTTPS toujours avec Sécurité du transport HTTP Strict (HSTS) :

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

Veuillez noter que le HSTS est pris en charge par la plupart des navigateurs modernes, mais pas par tous. Ainsi, la logique ci-dessus redirige manuellement l'utilisateur, quel que soit le support, s'il aboutit sur HTTP, puis définit l'en-tête HSTS afin que les demandes ultérieures du client soient redirigées par le navigateur si possible.

19voto

MatHatrik Points 556

Je viens de créer un fichier .htaccess et j'ai ajouté :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Simple !

11voto

Jay Points 315

La méthode PHP :

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit(1);
}

La méthode Apache mod_rewrite :

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X