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

j'ai juste une page que je veux forcer à être consultée en tant que page HTTPS (PHP sur Apache). Comment puis-je faire cela sans rendre tout le répertoire require HTTPS? Ou, si vous soumettez un formulaire à une page HTTPS à partir D'une page HTTP, l'envoie-t-il par HTTPS au lieu de HTTP?

Voici mon exemple:

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

je veux seulement être accessibles via:

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

bien sûr, je peux mettre tous les liens vers cette page pointé sur la version HTTPS, mais cela n'empêche pas un imbécile d'y accéder par HTTP exprès...

une chose que je pensais était de mettre une redirection dans l'en-tête du fichier PHP à vérifier pour être sûr qu'ils accèdent à 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 la bonne façon, n'est-ce pas?

BTW, s'il vous plaît prêter aucune attention à l'URL. Je sais que si c'était vraiment une page où il y avait un panier, etc., vous serait-il le faire d'une manière différente. Pensez-y comme une page d'un site qui vend un article pour un prix lorsque vous saisissez vos informations de carte de crédit pour être soumis à une passerelle de paiement sur un site externe dans le but exprès de chargement de votre carte une fois.

121
demandé sur 9 revs, 6 users 45%Wiki 2008-09-17 21:51:06

19 réponses

la façon dont je l'ai fait avant est fondamentalement comme ce que vous avez écrit, mais n'a pas de valeurs hardcoded:

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}
162
répondu Adam Rosenfield 2011-06-21 16:34:31

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 L'emplacement plus intelligent au fil du temps en utilisant expressions régulières si vous voulez.

45
répondu thebigjc 2009-10-19 09:23:58

vous devez forcer le" client 151920920 à demander HTTPS toujours avec HTTP Strict Transport Security (HSTS) headers:

// 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 HSTS est pris en charge dans la plupart des navigateurs modernes, mais pas universel. Ainsi, la logique ci-dessus redirige manuellement l'utilisateur indépendamment du support S'il se retrouve sur HTTP, puis définit l'en-tête HSTS de sorte que d'autres requêtes client doivent être redirigées par le navigateur si possible.

36
répondu Jacob Swartwood 2013-04-25 23:28:51

je viens de créer un .fichier htaccess et ajouté:

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

de Simples !

12
répondu MatHatrik 2015-06-23 10:37:31
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}
8
répondu Jeff 2017-03-29 10:41:20

a dû faire quelque chose comme ça en courant derrière un équilibreur de charge. Pointe du chapeau https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}
7
répondu syvex 2017-05-23 10:31:37

http://www.besthostratings.com/articles/force-ssl-htaccess.html

parfois, vous pouvez avoir besoin de s'assurer que l'utilisateur navigue sur votre site via la connexion securte. Une façon facile de toujours rediriger l'utilisateur vers la connexion sécurisée (https://) peut être réalisée avec un .fichier htaccess contenant les lignes suivantes:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/ [R,L]

s'il vous plaît, notez que le .htaccess doit être situé dans le dossier principal du site web.

dans le cas où vous souhaitez forcer HTTPS pour un dossier particulier, vous pouvez utiliser:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/ [R,L]

The .le fichier htaccess doit être placé dans le dossier où vous devez forcer HTTPS.

5
répondu itsazzad 2012-12-28 15:46:31

Ok.. Maintenant il ya des tonnes de choses sur ce maintenant, mais personne ne complète vraiment la "Sécurisé" à la question. Pour moi, c'est ridicule d'utiliser quelque chose qui n'est pas sécurisée.

sauf si vous l'utilisez comme appât.

$_SERVER la propagation peut être changée à la volonté de quelqu'un qui sait comment.

aussi comme Sazzad Tushar Khan et le thebigjc ont déclaré que vous pouvez également utiliser httaccess pour faire ceci et il y a beaucoup de réponses ici qui le contiennent.



Il suffit d'ajouter:



RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/ [R,L]

à la fin de ce que vous avez dans votre .httaccess et c'est qui.

pourtant, nous ne sommes pas aussi en sécurité que nous le pouvons avec ces 2 outils.

le reste est simple. Si il manque des attributs ie...

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_HOST'],"mywebsite.com") === FALSE){// Something is FISHY
}



dites aussi que vous avez mis à jour votre fichier htttaccess et que vous cochez:

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

Il ya beaucoup plus de variables que vous pouvez vérifier ie..

HOST_URI (S'il y a des contributions statiques à ce sujet pour vérifier)

HTTP_USER_AGENT (même session valeurs différentes)

Donc tout ce que je dis N'est pas de se contenter de l'un ou l'autre quand la réponse se trouve dans une combinaison.



Pour plus d'informations sur la réécriture de httaccess voir le docs - > http://httpd.apache.org/docs/2.0/misc/rewriteguide.html



quelques piles ici - > forcer SSL / https en utilisant .htaccess et mod_rewrite

et

obtenir l'URL complète de la page actuelle (PHP)

pour en nommer un couple.

5
répondu JSG 2018-03-05 06:58:29

utiliser $_SERVER['HTTPS'] pour dire si elle est SSL , et rediriger vers le bon endroit si non.

et rappelez-vous, la page qui affiche le formulaire n'a pas besoin d'être alimentée par HTTPS, c'est L'URL post back qui en a le plus besoin.

Edit : oui, comme indiqué ci-dessous, il est préférable d'avoir L'ensemble du processus en HTTPS. C'est beaucoup plus rassurant - j'étais en soulignant que le post est la partie la plus critique. En outre, vous devez prendre soin que les cookies sont définis pour être sûr, de sorte qu'ils ne seront envoyés via SSL. La solution mod_rewrite est également très astucieuse, Je l'ai utilisé pour sécuriser de nombreuses applications sur mon propre site web.

3
répondu DGM 2011-10-19 19:51:40

utiliser htaccess :

#if domain has www. and not https://
  RewriteCond %{HTTPS} =off [NC]
  RewriteCond %{HTTP_HOST} ^(?i:www+\.+[^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]

#if domain has not www.
  RewriteCond %{HTTP_HOST} ^([^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]
3
répondu siavash bagheri 2017-12-05 14:07:02

ne mélangez pas HTTP et HTTPS sur la même page. Si vous avez une page de formulaire qui est servie via HTTP, je vais être nerveux à propos de soumettre des données -- Je ne peux pas voir si le soumettre va sur HTTPS ou HTTP sans faire une Source de vue et la chasse pour elle.

servir le formulaire sur HTTPS avec le lien soumettre n'est pas si lourd un changement pour l'avantage.

1
répondu JBB 2009-10-19 09:23:26

utiliser ceci N'est pas suffisant:

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

si vous avez un contenu http (comme une source d'image http externe), le navigateur détectera une menace éventuelle. Alors assurez-vous que tous vos codes ref et src à l'intérieur de votre code sont https

1
répondu bourax webmaster 2016-08-17 12:47:12

pour ceux qui utilisent IIS ajoutant cette ligne dans le web.config aidera:

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
         </rule>
    </rules>
</rewrite>

un fichier d'exemple complet

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>
1
répondu Tschallacka 2017-04-06 10:07:50

vous ne devriez pas pour des raisons de sécurité. Surtout si des cookies sont en jeu ici. Il vous laisse largement ouvert aux attaques de replay basées sur les cookies.

dans tous les cas, vous devez utiliser les règles de contrôle Apache pour l'accorder.

ensuite, vous pouvez tester si HTTPS est activé et rediriger si nécessaire.

vous devez rediriger vers la page de paye en utilisant un formulaire POST (no get), et les accès à la page sans POST doivent être dirigés retour aux autres pages. (Cela va attraper les gens juste saut à chaud.)

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

est un bon point de départ, désolé de ne pas en avoir fourni plus. Mais vous vraiment devrait tout pousser à travers SSL.

c'est trop protecteur, mais au moins tu as moins de soucis.

0
répondu Kent Fredric 2009-10-19 09:23:35

si vous utilisez Apache ou quelque chose comme LiteSpeed, qui supporte .htaccess files, vous pouvez faire ce qui suit. Si vous n'en avez pas déjà un .fichier htaccess, vous devez créer un nouveau .le fichier htaccess dans votre répertoire racine (généralement où votre index.php est situé). Maintenant, ajoutez ces lignes comme première règle de réécriture dans votre .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

vous n'avez besoin de l'instruction" RewriteEngine On " qu'une seule fois dans votre .htaccess pour toutes les règles de réécriture, donc si vous l'avez déjà, copiez la deuxième et la troisième ligne.

j'espère que cela aidera.

0
répondu Antonio 2016-08-03 10:29:09

j'ai été à travers beaucoup de solutions avec Vérifier le statut de $_SERVER[HTTPS] mais semble comme il n'est pas fiable parce que parfois il ne se fixe pas ou ne se fixe pas à on, off, etc. provoquer la redirection du script vers la boucle interne.

Voici la solution la plus fiable si votre serveur prend en charge $_SERVER [SCRIPT_URI]

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]'>";
    exit;
}

veuillez noter que selon votre installation, votre serveur pourrait ne pas supporter $_SERVER[SCRIPT_URI] mais si elle le fait, c'est le meilleur script à utiliser.

vous pouvez vérifier ici: pourquoi certaines installations PHP ont $_SERVER ['SCRIPT_URI'] et d'autres pas

0
répondu Tarik 2017-05-23 12:10:45

peut-être que celui-ci peut aider, vous, c'est comme ça que j'ai fait pour mon site web, ça marche comme un charme:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}
0
répondu Héouais Mongars 2018-04-17 09:48:12

j'ai utilisé ce script et il fonctionne bien à travers le site.

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    enter code hereheader('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}
-1
répondu Esteban Gallego 2016-07-26 01:06:30
<?php 
// Require https
if ($_SERVER['HTTPS'] != "on") {
    $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
    header("Location: $url");
    exit;
}
?>

c'est facile.

-3
répondu Spell 2014-09-29 00:23:02