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 :

[php 7.2.4][apache 2.4.33] caractère + dans l'url


Sujet :

Apache

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut [php 7.2.4][apache 2.4.33] caractère + dans l'url
    Bonjour,
    j'ai repris en main le site internet d'un ami et j'ai du revoir les urls.

    Parmis certaines anciennes url j'ai des fois le caractère +

    www.monsite/truc+/blabla


    Je dois rediriger les anciennes url vers le nouveau format d'url.
    Le problème c'est que les url arrivent "nettoyés" du caractère dans mon routeur et je ne comprends pas pourquoi.

    www.monsite/truc /blabla

    Mon fichier .htacces:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteEngine On
    RewriteRule ^.*$ index.php?p=$0 [L,QSA]
    mon fichier index.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?php
    exit($_GET["p"]);

    J'ai repéré ce bug sur le site en ligne avec le code complet du site mais je n'ai pas fait de tests pour voir a quel moment le signe + disparait.
    Le code donné ici est celui que j'utilise sur mon serveur local.

    Le problème apparait donc sur 2 serveurs différents et avec un code on ne peut plus simple sur le serveur local.

    quelqu'un a une idée pour stopper ce filtrage?
    Le + n'est pas trop recommandé dans l'url mais ce n'était pas non plus un caractère réservé à une certaine époque.

    ps: Les nouvelles url n'utilisent plus ce caractère!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    J'ai trouvé cette piste:

    https://www.ipgirl.com/1364/url-enco...ace-ou-20.html

    Le caractère + pourrait bien passer a travers apache sans encombre mais il serait pris pour un espace qui aurait été encodé sous la forme d'un caractère +
    Il est alors décodé pour retouver sa forme initiale qui serait théoriquement un espace selon le décodeur.

    La question c'est de savoir où se situe le décodeur et a quel moment il opère.
    Quels tests je peux faire pour vérifier que l'url est contient toujours le caractère + et où puis je faire ces tests selon vous?

    A savoir: les anciennes url et l'ancien site fonctionnait sous php 5.4 et je suis maintenant passé sous php 7.2.4
    Pour ce qui concerne apache je ne sais pas si la version a changé aussi.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Finalement le caractère + n'est pas filtré par apache mais décodé par PHP lorsque je récupère la chaine dans$_GET["p"]

    Pour vérifier cette info j'ai fait ça:

    url = monsite/truc+/aaa

    .htaccess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteEngine On
    RewriteRule ^.*$ index.php?p=$0 [L,QSA]

    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var_dump($_GET);
    var_dump($_SERVER['QUERY_STRING']);
    exit($_GET["p"]);

    resultat dans le navigateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...\index.php:3:
    array (size=1)
      'p' => string 'truc /aaa' (length=9)
     
    ...\index.php:5:string 'p=index.php&p=truc+/aaa' (length=23)
     
    truc /aaa

    Du coup je constate un autre problème, normalement dans $_SERVER['QUERY_STRING'] je devrais juste avoir "p=truc+/aaa"

    pourquoi j'ai 'p=index.php' également ?
    C'est comme si j'était passé 2 fois par le .htaccess avant d'arriver à index.php


    si je remplace index.php?p=$0 par index.php?x=$0
    j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'x=index.php&x=truc+/aaa'

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Bon a priori le contenu de "QUERY_STRING" est peut être normal.
    Les exemples d'utilisation de cette variable que j'ai trouvé sur internet sont peut être basé sur des pages sans réecriture d'url.

    En regardant les autres variables $_SERVER en rapport, on se rends compte que tout semble bien marcher du coté apache:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      'REDIRECT_URL' => string '/truc+/aaa' (length=10)
      'REDIRECT_QUERY_STRING' => string 'p=truc+/aaa' (length=11)
      'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
      'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
      'REQUEST_METHOD' => string 'GET' (length=3)
      'QUERY_STRING' => string 'p=index.php&p=truc+/aaa' (length=23)
      'REQUEST_URI' => string '/truc+/aaa' (length=10)
      'SCRIPT_NAME' => string '/index.php' (length=10)
      'PHP_SELF' => string '/index.php' (length=10)
    Il me reste à définir a partir de quel variable je dois extraire la partie de l'url qui m'interresse sans risque d'erreur.
    Par exemple avec ce genre d'utilisation je pourrai avoir des surprises:

    www.monsite.fr/truc+/aaa?page=12

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    c'est sympa de donner les détails de vos avancées, cela pourra aider des autres utilisateurs du forum.

    pour votre question concernant l'utilisation des valeurs dans $_SERVER, j'ai souvent vu utilisé la clé "REQUEST_URI" donc c'est surement une bonne base pour votre problème.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Oui j'avais remarqué ça aussi.

    J'ai essayé et ça ne me convient pas, en entrant une url comme celle là:
    monsite.fr/truc+/aaa&page=12

    REQUEST_URI me renvoie "/truc+/aaa?page=12"

    REDIRECT_URL me convenait mieux: "/truc+/aaa"
    mais quand j'ai voulu tester sur le site en ligne le routeur du site a bugué.
    Je ne sais pas encore pourquoi mais peut être que le contenu de REDIRECT_URL n'est pas pareil chez mon hébergeur.
    Ou bien c'est le format de l'url que j'ai peut être converti en UTF-8 au lieu de l'ASCII habituel ou inversement?

    Sur le coup je pensais avoir trouvé une solution simple mais je vais devoir faire des tests plus poussés en local avant de mettre en ligne.

Discussions similaires

  1. [Oracle] Chargement de DLL Oracle - PHP 5.2.5 Apache 2.0.55
    Par jltgab dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/05/2009, 10h14
  2. [Oracle] [php 5.1.6, Apache 2.0.63] Call to undefined function OCILogon()
    Par Zipyz dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 23/03/2009, 10h03
  3. lien en php vers le serveur apache
    Par brice14000 dans le forum Apache
    Réponses: 12
    Dernier message: 17/11/2008, 16h27
  4. Couche PHP au dessus d'Apache/Webdav
    Par slideveloppeur2006 dans le forum Apache
    Réponses: 1
    Dernier message: 18/04/2007, 15h00

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