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

Langage PHP Discussion :

Fonction pour valider une URL


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut Fonction pour valider une URL
    Bonjour à tous, voici mon problème :

    J'ai une fonction qui m'attrape l'URL entrée dans le navigateur et une autre qui me la valide. Concernant la fonction qui me récupère l'URL, j'ai juste besoin d'une confirmation pour savoir si ma méthode est bonne pour attraper le protocole utilisé (http ou https) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Récupère l'URL courante
    protected static function GetUrl() {
        $protocol = (isset($_SERVER['HTTPS']))? ($SERVER['HTTPS'])? 'https://' : 'http://' : 'http://';
        self::$url = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    }
    Par contre je ne vois pas comment valider mon URL en sachant que celle-ci ne doit contenir que des caractères alphanumériques (a-z et 0-9), des tirets et des underscores (- et _), des slash (/) et ... je crois que c'est tout (surtout pas de paramètres remplaçables car je les passe en dur dans l'URL justement. Il faut aussi éviter les slash / multiples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Valide l'URL pour traitement par le contrôleur frontal
    protected static function ValidateUrl() {
        $uri = $_SERVER['REQUEST_URI'];
        return true;
    }
    Merci d'avance pour vos conseils.

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $protocol = (isset($_SERVER['HTTPS']))? ($SERVER['HTTPS'])? 'https://' : 'http://' : 'http://';
    j'ai l'impression que le isset($_SERVER['HTTPS']) et le $_SERVER['HTTPS'] fait doublon, je me trompe?

    Pour l'url il est aussi possible d'avoir des caractères spéciaux (%20, %50) pour les espaces et les caractères accentués. Il y a aussi les accès au parent (../../../..)
    Une expression régulière permettrait de vérifier la forme de ton url facilement.

  3. #3
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut
    j'ai l'impression que le isset($_SERVER['HTTPS']) et le $_SERVER['HTTPS'] fait doublon, je me trompe?
    Non c'est fait exprès, je vérifie d'abord si la variable est disponible (si le serveur supporte HTTPS, puis si le isset() renvoie vrai je teste son contenu :

    c'est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $existe = isset($_SERVER['HTTPS']);
    if($existe) { $result = ($SERVER['HTTPS'])? 'https://' : 'http://'; }
    Pour l'url il est aussi possible d'avoir des caractères spéciaux (%20, %50) pour les espaces et les caractères accentués. Il y a aussi les accès au parent (../../../..)
    Oui je sais mais mes URL seront de type :
    http://www.mon-site.fr/controller/ac...param2/valeur2...
    Donc pas de '..' ou de '.', pas de '?' ou de '=' et pas d'espaces ni de caractères accentués. Voici ma fonction de parsing :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    // Décompose l'URL pour récupérer les données
    protected static function ParseUrl() {
        self::GetUrl();
        if(self::ValidateUrl()) {
            $buffer = explode('/', $_SERVER['REQUEST_URI']);
            if(empty($buffer[sizeof($buffer)-1])) { 
                array_pop($buffer);
            }
            self::$hostname = array_shift($buffer);
            if(sizeof($buffer)) {
                self::$controller = array_shift($buffer);
            }
            if(sizeof($buffer)) {
                self::$action = array_shift($buffer);
            }
            while(sizeof($buffer)) {
                self::$params[array_shift($buffer)] = 
                    (sizeof($buffer))? array_shift($buffer) : '';
            }
        }
        else {
            if(self::$enable404error) {
                header("HTTP/1.0 404 Not Found");
                exit();
            }
        }
    }
    Le seul truc c'est comment je vérifie que mon url corresponde bien au modèle que j'ai donné plus haut : http://www.monsite.net/controleur/action/param1...

    Une expression régulière permettrait de vérifier la forme de ton url facilement.
    Ben oui justement, et les expressions régulières je suis pas très à l'aise avec, j'en fait un peu mais vraiment du basique.

    Merci pour votre aide.

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $existe = isset($_SERVER['HTTPS']); if($existe) { $result = ($SERVER['HTTPS'])? 'https://' : 'http://'; }
    si isset($_SERVER['HTTPS']) et à true cela signifie que tu es bien en protocol https sinon en http.

    ou sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $protocol = 'http://';
    if (@$SERVER['HTTPS'])
        $protocol = 'https://';
    Qui me parait à moi plus court et plus lisible. Faut dire aussi que l'opérateur trinaire je n'ai jamais trouvé ça très lisible encore moins quands ils sont impriqués


    Par contre la valeur d'un paramètre dans ton url ne comportera jamais de caractères spéciaux? Si tu veux passer une valeur avec des accents ou une url tu le passe en POST?

  5. #5
    Membre confirmé Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Par défaut
    si isset($_SERVER['HTTPS']) et à true cela signifie que tu es bien en protocol https sinon en http.
    Je savais pas pour ça, excellent je modifie cela répond à mon premier doute concernant la détection du protocole.

    Par contre la valeur d'un paramètre dans ton url ne comportera jamais de caractères spéciaux? Si tu veux passer une valeur avec des accents ou une url tu le passe en POST?
    Oui pour l'instant ça doit rester très simple mon URL sera toujours de type :
    http://www.monsite.org/controller/ac...aram_2/valeur2...
    en fait normalement les paramètres seront juste du style passer une ID :
    http://www.monsite.org/controllernam...nname/page/10/ par exemple.

    donc je voudrais vérifier les points suivants :

    • pas de multiples slashes ////
    • uniquement des lettres sans accents, des chiffres, tirets et underscores
    • pas d'espaces


    Le but est d'optimiser le référencement du site en fait, rien que des url propres. C'est l'expression régulière que j'ai du mal à pondre.

    Merci pour ton aide

Discussions similaires

  1. Fonction pour valider une numéro de Tel
    Par algerino77 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/12/2013, 14h51
  2. Réponses: 3
    Dernier message: 18/02/2013, 05h15
  3. fonction pour valider une adresse ip
    Par charlie_p07 dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/10/2008, 14h52
  4. Réponses: 12
    Dernier message: 22/02/2005, 17h45
  5. [DOM] Erreur pour valider une DTD
    Par lenghh dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 19/05/2004, 18h15

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