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 :

URL rewriting, une énigme!


Sujet :

Apache

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut URL rewriting, une énigme!
    Bonjour,

    J'essaye en vain d'utiliser l'url rewriting sur mon site web. J'aimerais réécrire les adresses simplement, si possible en insérant les mots clés de mes news dans l'adresse de la page "detail.php" sur la barre d'adresse (je ne sais pas comment faire ça). J'aimerais aussi ne pas avoir à modifier les liens dans mes fichiers php, si un fichier htaccess suffit c'est génial! Je suis hébergé par "bluehost".

    Mon acharnement vise à transformer les types d'adresses suivantes:

    index.php?page=2
    index.php?page=2&tri=asc
    index.php?page=2&tri=desc

    index.php?stat=comment
    index.php?page=2&stat=comment

    index.php?stat=like
    index.php?page=2&stat=like

    detail.php?news=22
    account.php?pseudo=Yopla

    Voici la tête de mon fichier .htaccess:

    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
    #--------------------------------------------------
    # Répertoire : /www/
    #--------------------------------------------------
     
    # Le serveur doit suivre les liens symboliques :
    3Options +FollowSymlinks
     
    # Activation du module de réécriture d'URL (!!!mettre à on):
    RewriteEngine off
     
    #--------------------------------------------------
    # Règles de réécriture d'URL :
    #--------------------------------------------------
     
    # Article sans numéro de page :
    #RewriteRule ^news-([0-9]+)\.html$   /detail.php?news=$1 [QSA,L]
     
    # Index avec numéro de page : index-2.html
    #RewriteRule ^index-(.*)\.html$ /index.php?page=$1 [QSA,L]
     
    # Index avec numéro de page et tri : index-2-asc.html
    #RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&tri=$2 [QSA,L]
    Merci beaucoup pour votre aide, je suis nouveau dans le domaine et autodidacte

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    A part le fait qu'il faut décommenter (activer) les règles, je ne vois pas de problème. C'est quoi le souci ?

    Pour la modification des liens dans les pages, c'est dommage, va falloir que tu t'y mettes Apache ne le fera pas pour toi sauf à utiliser des redirections inavouables ou mod_proxy_html mais je doute que ce soit possible chez ton hébergeur et ce n'est pas beau non plus.

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    Merci pour ta réponse. Je vais exposer mon problème par étapes.

    Le scénario est le suivant:

    J'ai une page index.php qui regroupe plusieurs news. En bas de la page, il y a des numéros de page pour voir les news plus anciennes. Toujours sur cette page d'index, on peut trier les news suivant le nombre de commentaires qu'elles ont reçues, ou bien le nombre de "like".

    A l'heure actuelle, quand je clique sur les liens de page en bas de "index.php", je tombe sur la deuxième page: index-2.html . Si je clique sur le lien "1", je tombe sur index-1.html. Parfait.

    Ca se corse quand je clique sur le lien "Les plus commentées". En faisant ça, je tombe sur "index-stat-comment.html". Parfait et ça marche indéfiniment. Je vais en bas de page, je clique sur le lien pour me rendre à la page 2 et je tombe sur "index-2-comment.html". Toujours parfait.

    Le problème, c'est que si je clique maintenant sur le lien 1 pour retomber sur la première page (contenant les news les plus commentées), je tombe sur:
    index-1.html au lieu de index-1-comment.html!


    Ca doit être une histoire de $_GET qui m'échappe complètement. Pouvez-vous m'aider?

    Pour info le htaccess actuel:

    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
    28
    29
    30
    Options +FollowSymlinks
     
    #--------------------------------------------------
    # Répertoire : /www/
    #--------------------------------------------------
     
    # Le serveur doit suivre les liens symboliques : Options +FollowSymlinks
     
     
    # Activation du module de réécriture d'URL (!!!mettre à on):
    RewriteEngine on
     
    #--------------------------------------------------
    # Règles de réécriture d'URL :
    #--------------------------------------------------
     
    # Article sans numéro de page :
    RewriteRule ^news-([0-9]+)\.html$   /detail.php?news=$1 [QSA,L]
     
    # Index avec juste un tri par commentaires ou like: index-comment.html !!!!!
    RewriteRule ^index-stat-(.*)\.html$ /index.php?stat=$1 [QSA,L]
     
    # Index avec numéro de page : index-2.html
    RewriteRule ^index-(.*)\.html$ /index.php?page=$1 [QSA,L]
     
    # Index avec numéro de page et tri : index-2-asc.html
    RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&tri=$2 [QSA,L]
     
    # Index avec numéro de page et stat : index-2-comment.html
    RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&stat=$2 [QSA,L]
    Et le script qui génère les liens vers les pages de news:

    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
    //création des liens vers les pages de news 
     
    if(isset($_GET['tri']))
    	$tri = '-' . $_GET['tri'] . '.html';
    else
    	$tri = '.html';
     
    if(isset($_GET['stat']))
    	$stat = '-' . $_GET['stat'];
    else
    	$stat = '';
     
    echo '<p class=\'nav_center\'>Page : ';
     
    for($numeroPage = 1; $numeroPage <= $nombreDePages; $numeroPage++)  
    {
    	if($page === $numeroPage)
    	{
    		echo ' [<strong>'.$page.'</strong>] ';
    	}
    	else
    		echo '<a href="index-' . $numeroPage . '' . $stat . '' . $tri .'">' . $numeroPage . '</a>&nbsp;';
    }
    echo '</p>';
    Merci beaucoup à vous!

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Ce que je vais dire n'a peut-être aucun rapport avec le problème car je n'ai pas lu le code PHP mais il y a un "problème de conception" avec le .htaccess. Les lignes en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # Index avec numéro de page : index-2.html
    RewriteRule ^index-(.*)\.html$ /index.php?page=$1 [QSA,L]
     
    # Index avec numéro de page et tri : index-2-asc.html
    RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&tri=$2 [QSA,L]
     
    # Index avec numéro de page et stat : index-2-comment.html
    RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&stat=$2 [QSA,L]
    Le problème c'est que :
    • Avec ce fichier, les 2 dernières règles ne sont jamais activées car le filtre de la première règle "^index-(.*)\.html$" englobe les filtres des deux autres règles. Donc on se retrouve toujours avec la seule première règle qui est activée, donc une query string qui ne contient jamais que le paramètre page.
    • Quand bien même le premier problème n'existerait pas, la dernière ligne n'est jamais activée car son filtre est strictement identique à la règle précédente.

    Je propose donc de commencer par mettre la première de ces 3 règles (celle avec le filtre "^index-(.*)\.html$") tout en bas du fichier.
    Pour le problème des 2 règles avec le même filtre, je te laisse nous expliquer la raison et dire comment construire des filtres plus précis.

  5. #5
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    Merci pour tes conseils, ça a résolu mes problèmes!

    J'ai presque terminé l'url rewriting mais pour la page des catégories il y a un plantage (call to a function fetch on a non object).

    L'url de départ est du style:

    categorie.php?name=Vid%26eacute%3Bos

    Je pense que c'est le nom de la catégorie que le fichier htaccess ne reconnait pas. Une idée?

    Ah oui aussi, j'aimerais que l'internaute ne voie jamais index.php mais plutôt qu'il voie www.monsite.com et je cherche une solution à implémenter dans le htaccess sans devoir indiquer www.monsite.com car le site que je développe pourra servir à d'autres et j'essaye de dépersonnaliser le code.

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Rien compris à ton histoire de catégorie : où est-ce que tu parles de catégorie dans tout ce qui précède ? C'est quoi l'URL demandée et pourquoi dis-tu qu'Apache ne reconnaît pas le nom de la catégorie ?

    Je ne comprends pas non plus la seconde question : où est-ce que le visiteur voit index.php dans l'URL ?

  7. #7
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    J'avais oublié de le préciser, mais sur mon site il y a aussi des catégories de news (des sections): vidéos,musique,... et donc quand je clique sur le lien "vidéos" je tombe sur la page section.php?name=Vid%26eacute%3Bos

    Je veux la réécrire à l'aide du .htaccess pour obtenir ce type d'url:

    http://www.monsite.com/section-name-...cute%3Bos.html

    Pour ce faire, j'insère la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule ^section-name-(.*)\.html$ /section.php?name=$1 [QSA,L]
    Mais quand je tape directement l'adresse réécrite http://www.monsite.com/section-name-...cute%3Bos.html dans la barre d'adresse, j'obtiens une erreur:

    Fatal error: Call to a member function fetchAll() on a non-object
    D'ailleurs sur la page qui s'affiche, à la place du titre de la section "Vid%26eacute%3Bos" décodé de l'UTF8 donc "Vidéos", il est affiché "Vid". A croire que le htaccess n'a pas tenu compte des caractères "%26eacute%3Bos". Par conséquent, quand je récupère l'id de la catégorie à partir de son nom tronqué, sql ne renvoie rien de bon et j'ai un erreur à cet endroit du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sth = $dbh->query($sql);
    $result = $sth->fetchAll();
    ...alors que ça fonctionne sans la réécriture d'url.

    Pour passer les noms des catégories via l'URL j'encode les chaînes de caractères en UTF8 ce qui transforme les accents et supprime les espaces et c'est toujours reconvertissable en la chaine d'origine. Je n'arrivais pas à faire fonctionner les htmlentities()...

    Pour la seconde question, quand un visiteur se rend sur mon site il voit www.monsite.com/index.php

    Je voudrais qu'il ne voie que www.monsite.com, qu'il ne sache pas que c'est fait en php.

    C'est plus clair maintenant?

    Merci!

  8. #8
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Il faut savoir deux choses :
    • l'encodage HTML n'est pas le même que l'encodage URL : en HTML, é se traduit en &eacute; alors qu'en URL il se traduit pas %E9.
    • mod_rewrite ne change pas le code HTML qui est renvoyé au navigateur. Là, visiblement, c'est le code HTML reçu par le navigateur qui contient un lien avec un mauvais encodage du é. Donc la première chose que je ferai c'est regardé le code HTML reçu par le navigateur. Si le lien est bien
      Code html : Sélectionner tout - Visualiser dans une fenêtre à part
      <a href="/section-name-Vid%26eacute%3Bos.html">
      c'est qu'il y a un problème avec le code PHP qui génère ce lien, pas Apache.


    En revanche, côté Apache, ce qu'il faut c'est que la bonne URL avec %E9 (/section-name-Vid%E9os.html) renvoie le bon résultat.

  9. #9
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    Merci beaucoup pour ta réponse J'ai passé la soirée à essayer de changer les encodages de catégories de news mais je m'y retrouve vraiment pas.

    Pourrais-tu me donner des conseils sur les fonctions à utiliser dans l'ordre pour encoder le nom de la catégorie de news en BDD et puis ce qu'il faut faire pour décoder et transmettre le nom par un $_GET, et enfin comment retraiter ce nom du $_GET pour le comparer au nom stocké en BDD et ainsi récupérer toutes les news dont l'id correspond au nom qu'on cherche.

    J'ai vraiment cherché mais je patauge avec les htmlentities,addslashes,utf8 encode, urlencode etc.

    Merci beaucoup

  10. #10
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    A la limite, pour calculer les URL (le <a href>), je ne ferais rien du tout : je récupèrerais ce qu'il y a en base de données directement pour construire l'URL sans l'encodée. C'est le navigateur qui se chargera ensuite d'encoder "comme il faut". Au pire, il ne faut utiliser que urlencode.

    En fait, il faut que tu stockes en base de données la donnée non encodée (avec un é) ou nettoyée (tu remplaces les é par des e, etc.) pour s'affranchir des problèmes d'encodage. Ce qu'il faut ensuite c'est s'assurer partout (base de données, encodage des fichiers PHP, content type renvoyé par le serveur, code HTML) que tu utilises ne même encodage. Comme ça, tu t'affranchiras des risques de transcodage pour passer d'un encodage à un autre. Si tu dois faire des bricoles pour emboîter dans un ordre bien précis les fonctions que tu cites, tu vas trop loin.

  11. #11
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    Salut,

    Merci Je suis assez fatigué alors je vais répondre vite et revenir après avoir dormi. J'ai réussi, enfin je pense! J'ai simplifié comme tu l'as suggéré mais j'ai quand-meme utilisé urlencode et decode.

    Avec l'url rewriting j'obtiens un lien "a href" de la catégorie:

    www.monsite.com/section-name-%E9t%E9+am%E8re+d%5C%27ao%FBt.html

    Dis-moi si ça te semble bon.

    Les news s'affichent bien dans la catégorie voulue.

    Ps: la catégorie de l'exemple est "été amère d'août", ne veut rien dire mais c'est pour les accents.

    Par contre après avoir récupéré le lien de la catégorie par $_GET (et passé à urlencode()) j'ai vu /// que j'ai dû supprimer de la chaîne par deux stripslashes successifs:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		$name = $_GET['name'];
    		$section = urldecode($name);
    		$comparerAvecBDD = $section;
    		$nom_rubrique = stripslashes($section);
    		$nom_rubrique = stripslashes($nom_rubrique);

    Ce /// est une énigme pour moi

  12. #12
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par Sébastien L Voir le message
    Avec l'url rewriting j'obtiens un lien "a href" de la catégorie:

    www.monsite.com/section-name-%E9t%E9+am%E8re+d%5C%27ao%FBt.html

    Dis-moi si ça te semble bon.
    Oui, c'est correct.

    Citation Envoyé par Sébastien L Voir le message
    Par contre après avoir récupéré le lien de la catégorie par $_GET (et passé à urlencode()) j'ai vu /// que j'ai dû supprimer de la chaîne par deux stripslashes successifs
    Moi aussi. Logiquement, tu ne devrais pas avoir besoin d'urldecode : que vaut $_GET['name'] ?

  13. #13
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    Salut,

    C'est bizarre, j'ai accès aux différentes catégories sur le site en ligne (donc par ex http://www.monsite.com/categorie-%E9...%27ao%FBt.html) mais ça ne fonctionne pas en local dès qu'il y a des accents! (mais www.monsite.com/categorie-maison+blanche.html fonctionne en local avec Wampserver). Rewrite rule est activé dans les paramètres Apache. J'aimerais vraiment avoir un accès local car pour le moment je tombe sur une erreur 403:

    Forbidden

    You don't have permission to access /categorie-été+amère+d'août.html on this server.
    Edit: Voilà ce que donne $_GET['name'] sur la chaîne visible dans la barre d'adresse (/categorie-%E9t%E9+am%E8re+d%5C%27ao%FBt.html)...c'est un var_dump($_GET['name']):

    string(19) "été amère d\\\'août"

    Merci pour ton aide

    EDIT 27 juillet: Le problème est résolu Il fallait tout mettre en UTF8...

    En tout cas un tout grand merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [URL rewriting] Une variable pour la langue
    Par Invité dans le forum Apache
    Réponses: 5
    Dernier message: 14/06/2013, 22h03
  2. [URL Rewriting] Une variable avec un espace
    Par PrOkIuM dans le forum Apache
    Réponses: 10
    Dernier message: 19/03/2008, 11h41
  3. URL rewriting pour une meilleure visibilité
    Par Yoteco dans le forum MVC
    Réponses: 13
    Dernier message: 30/08/2007, 20h50
  4. [URL Rewriting] Obtention d'une erreur 500
    Par Invité dans le forum Apache
    Réponses: 7
    Dernier message: 24/07/2007, 18h04
  5. Récupérer l'url d'une page rewritée.
    Par psychoBob dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 03/02/2006, 00h28

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