IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

Redirection si HTTPS est sur "on"


Sujet :

Apache

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut Redirection si HTTPS est sur "on"
    voila mon probleme , je souhaite faire une redirection vers une page sécurisée si dans la page demandée si $_SERVER['HTTPS']="on"
    voici mon ficher de conf du hote virtuel en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <VirtualHost *:80>
    	ServerAdmin webmaster@monsite.com
    	DocumentRoot /home/Sites/monsite/www/
    	ServerName monsite.dev
    	ServerAlias dev.monsite
    	ErrorLog /home/Sites/monsite/logs/error_log
    	CustomLog /home/Sites/monsite/logs/access_log common
    	RewriteEngine on
    	RewriteRule ^/([a-z]{2})/([^/]*)/([^/]*)?$  /index.php?wlang=$1&wpage=$2 [L,QSA]
    	RewriteRule ^/([a-z]{2})/([^/]*)/([^/]*)/([^/]*)?$  /index.php?wlang=$1&wpage=$2&param=$3 [L,QSA]
    	RewriteCond %{HTTPS} !^on$
    	RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]
    	<Directory "/home/Sites/monsite/www">
    		AllowOverride None
    		Order allow,deny
    		Allow from all
    	</Directory>
    		AddDefaultCharset UTF-8
    </VirtualHost>
    à part la partie rouge tout est fonctionnel.
    dans mon index.php je ferai un if qui en fonction de la page cliquée il definit HTTPS sur "on" ou sur "off".
    toutes mes pages sont construites à partir de l'index et les templates et smarty correspondants.

    merci.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Ça ne marche pas comme ça : PHP n'a aucune influence sur Apache et il ne faut pas oublier que c'est Apache qui invoque le script et non l'inverse.

    D'autant plus que c'est le module ssl justement qui gère la variable HTTPS.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    alors tu a une idée de comment resoudre ce probleme autrement que de definir la variable HTTPS sur "on"?
    parce que j'ai chercher partout mais je n'ai rien trouvé de concret et surtout en rapport avec la conception de mon site

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Tout était réécrit en https ?

    Effectuer la redirection en PHP via l'index ? Définir une(des) condition(s) permettant de différencier directement ces cas par la réécriture ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    mon but c'est d'avoir deux repertoire differents , un pour le http et un autre pour le https , et pouvoir basculer entre les deux quand je veux une page sécurisée il va la chercher dans le repertoire qu'il faut, je ne veux pas tomber sur la page en modifiant l'url en enlevant le "s" du https , comme j'ai pu definir deux repertoire si on enleve le "s" il va alors chercher dans le repertoire du http mais il ne va pas trouver la page puisque les templates qui la constitue se trouve uniquement dans le repertoire du https.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Si on peut forcer le passage en https, on peut faire l'inverse.

    Le fait que les pages aient des répertoires différents ne permettait-il pas justement d'effectuer ce test ? La réécriture offre bien des options pour cela mais est certainement trop limitée pour convenir. On en reviendrait donc à PHP.

    Schématiquement :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    define('PAGE_DEFAUT', 'default');
     
    $page = isset($_GET['wpage']) && preg_match('/^[[:alpha:]]+$/D', $_GET['wpage']) ? $_GET['wpage'] : PAGE_DEFAUT;
    $https = isset($_SERVER['HTTPS']) && !strcasecmp($_SERVER['HTTPS'], 'on');
     
    function redirect($https_wanted = FALSE) {
        $url = ($https_wanted ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        if ($_GET) {
            $url .= '?' . $_SERVER['QUERY_STRING'];
        }
        header('Location: ' . $url);
        exit;
    }
     
    if (is_file('../templates/https/' . $page . '.tpl')) {
        if (!$https) {
            redirect(TRUE/*!$https*/);
        }
    } else {
        if (!is_file('../templates/http/' . $page . '.tpl')) {
            $page = PAGE_DEFAUT;
        }
        if ($https) {
            redirect(/*!$https*/);
        }
    }
     
    # Génération de la page

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    j'ai essayé ton code mais il m'envoi toujours le meme message d'erreur me disant que la page n'est pas redirigée correctement.
    j'ai essayé en mettant le header en commentaire, et un echo pour voir $url , l'affectation se fait bien comme il faut, si je l'ecrit moi meme dans le navigateur ca marche mais si c'est redirigé avec un header location ca fonctionne pas .
    as-tu une idée? en sachant qu'on utilise la reecriture d'url est-ce qu'il y'aurai pas un probleme a ce niveau la ?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    C'était juste un exemple et j'ai fait abstraction de toute réécriture.

    Vous avez bien retiré vos règles en rouge ?

    Etant donné l'option QSA des règles de réécriture, il n'y aurait pas besoin de gérer soi-même la query string, donc cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if ($_GET) {
            $url .= '?' . $_SERVER['QUERY_STRING'];
        }
    N'aurait plus lieu d'être. Mais c'est un détail sans lien.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    oui j'ai enlevé le if ($_GET) et j'ai bien retiré ce qui est en rouge, j'ai reussi a faire la redirection sauf que là il y'a un autre probleme . je me suis aperçu que le fait de mettre un www et un wwws , vu la taille de mon site et sa complexité c'est trop compliqué à mettre en oeuvre, donc j'ai reconfigurer apache pour aller chercher dans les deux cas dans le meme repertoire www, sauf que pour les redirection cela ne fonctionne pas car j'essaie de rediriger vers le meme dossier, y'a t'il un moyen pour pouvoir jongler entre http et https tout en etant dans le meme dossier?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Je pensais que c'était déjà le cas.

    Deux sites, en https ou non, peuvent parfaitement avoir le même DocumentRoot (c'est même souvent le cas). Ça ne gêne en rien Apache comme PHP (à moins de restrictions inadaptées au niveau de leurs configurations).

    Il se passe quoi au juste ? Ça boucle ? Les règles de réécriture avaient bien été recopiées dans le VH en https ? (maintenant autant utiliser un htaccess)

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    je pense savoir pourquoi j'ai le message d'erreur, voici ce qui cloche quand je definis le meme dessier pour le http et le https:
    j'ai inclus ca dans l'index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (  in_array('module.glossaire.tpl',$tabTpl))
    {
    		redirect(TRUE);
    }
    je n'avais pas ce probleme la quand je defini 2 dossiers car ce bout de code n'est pas dans index.php du dossier https ,maintenant puisqu'on redirige vers le meme index.php vu que je teste si le template glossaire(pour l'exemple) est dans ma page alors on redirige , sauf quand je redirige, il va rediriger de nouveau puisque le template y est toujours , donc ca boucle à l'infini. pour resoudre le probleme il faut rajouter quelque chose dans le if pour lui dire que si la page appelante est https://...com/glossaire alors ne pas rediriger , et ca je sais pas comment faire. je pense qu'en fesant comme ca mon probleme sera resolu, si tu a une idée de quel parametre il faudra rajouter dans le if ca me sauverai lol

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il y a tout ce qu'il faut dans le tableau superglobal $_SERVER (REQUEST_URI ? SCRIPT_FILENAME ?). Et pour tester le protocole, c'est déjà réalisé.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    j'ai reussi à faire la redirection en modifiant la fonction redirect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function redirect($https = FALSE) {
        $url = ($https ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    	//on initialise une variable de session qui indiquera si on doit etre dans https
    	if ($https) 
    		{
    			$_SESSION['HTTPS']=TRUE;
     
    		}	
    	else
    		{
    			$_SESSION['HTTPS']=FALSE;
     
    		}
     
    	header('Location: ' . $url);
    	exit;
    }
    et en rajoutant && $_SESSION['HTTPS']==FALSE dans le if , ca marche très bien, sauf que si l'utilisateur enleve le s de https du navigateur , la variable de session 'HTTPS' ne sera pas modifiée car on est pas passé par le redirect on va sur la meme page en mode non sécurisé, et ca niet je veux pas!
    ce que je pourrai faire c'est de tester avec (strncasecmp($_SERVER['SCRIPT_URI'],"https://",6)== 0) sauf que SCRIPT_URI contient tout le temps l'url "http://..." sans le 's' que je soit connecté avec le protocole http ou https, meme chose pour numero de port qui indique tout le temps 80 alors qu'il devrait etre a 443 quand je suis en https, j'ai affiché ca grace à print_r($_SERVER).
    est-ce que tu a une idée de pourquoi ces parametres ne sont pas changés quand je suis en https ?

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il faudrait vérifier votre configuration https alors.

    Pourquoi pister le client ? Je ne comprends pas cet usage de la session, ça n'apporte rien au but poursuivi et ce n'est pas fiable ! Je rappelle que pour déterminer si vous êtes ou non en https, il vous suffit d'utiliser quelque chose comme ça :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $https = isset($_SERVER['HTTPS']) && !strcasecmp($_SERVER['HTTPS'], 'on');
    #define('IS_HTTPS', isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on');

    Note : la variable SCRIPT_URI est définie par le module de réécriture uniquement lorsque celle-ci est active au niveau du serveur/VH (via RewriteEngine On). C'est donc dépendant de la configuration : il serait préférable de se baser sur une variable présente en toute circonstance (comme HTTPS).

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    j'ai vraiment repassé ma configuration apache au peigne fin , j'ai rien trouvé d'anormal, tout est ok.
    pour la variable HTTPS elle est tout le temps vide aussi , que je soit en http ou https donc le teste renverra tout le temps faux et ca aussi c'est un grand mystere pourtant le module ssl est bien activé et je le repete la connexion est bien sécurisée quand j'analyse le trafic reseau.
    en regardant de prés toutes les variable $_SERVER , j'ai remarqué que quand je change l'url à la main la valeur de HTTP_REFERER est vide donc j'ai modifié mon teste if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ((in_array('module.glossaire.tpl',$tabTpl) && $_SESSION['HTTPS']==FALSE ) 
    || (in_array('module.glossaire.tpl',$tabTpl) && !isset($_SERVER['HTTP_REFERER'])) )
    et ca marche, l'utilisateur qui s'amuse a changer l'url quand on est en http:// se vera renvoyé vers un message d'erreure disant que la page n'est pas redirigée correctement,ce probleme que j'avait ne se posera plus pour moi mais plutot au petit malin qui s'amuse a faire ca .
    je sais que c'est pas très chretien comme methode mais le fait que HTTPS n'est pas sur 'on' quand jsuis en connexion sécurisée je vois mal comment je pourrai reglé ca ...

Discussions similaires

  1. [Quote] DVP quoté sur Bashfr
    Par Skyounet dans le forum La taverne du Club : Humour et divers
    Réponses: 16
    Dernier message: 26/09/2006, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo