URL Rewriting avec titres textuels

Nouveau WRInaute
Bonjour à tous,

Je me lance dans l'URL rewriting. J'ai testé la solution suivante qui fonctionne parfaitement :

Code:
RewriteRule ^([0-9]+).html$ /test/cms/index.php?id=$1 [L]

L'adresse à réécrire donne ceci : 10.html.

Je veux cependant avoir un titre plus parlant et je veux utiliser un titre qui est présent dans ma base de données. Je modifie donc le code pour avoir ceci :

Code:
RewriteRule ^([0-9]+)-([a-z]*).html$ /test/cms/index.php?id=$1&titre=$2 [L]

Mais ça ne fonctionne pas alors que la page réécrite contient bel et bien le titre. Quelqu'un voit-il où est le problème ?

Merci d'avance
 
WRInaute accro
tu peux nous donner des exemples de titres et d'URL que tu souhaites obtenir ? Ya des majuscules ? des chiffres mélangés avec des lettres ?
 
Nouveau WRInaute
Salut, et merci pour ton aide.

En fait les titres sont des titres de pages dans le cadre d'un CMS où les clients peuvent ajouter des pages eux-mêmes. Logiquement ces titres devraient être juste composés de lettres mais prévoir que des chiffres puissent passer n'est peut-être pas une mauvaise idée. Dans l'état actuel des choses il y a des majuscules mais je peux m'en débarasser si elles posent problème.

Les adresses que j'obtiendrais avec le code ci-dessus s'il fonctionnait seraient du type 1-accueil.html mais j'aimerais avoir des adresses sans l'id et avec remplacement des espaces et apostrophes éventuelles par des tirets, donc quelque chose du genre nos-produits.html.

Voilà, j'espère que j'ai répondu à toutes tes questions.
 
WRInaute accro
En ce qui concerne le remplacement des apostrophes, espaces ..., il te faudra gérer ça en amont, en PHP. Le .htaccess ne pourra pas le faire.

Sinon, ta règle pourrait fonctionner, mais tu ne spécifies que des lettres minuscules dans ton $2. Ca vient peut etre de là.

Essaie peut etre (.*) qui veut dire "tout" pour ton $2:
Code:
RewriteRule ^([0-9]+)-(.*).html$ /test/cms/index.php?id=$1&titre=$2 [L]
 
Nouveau WRInaute
Merci de ton aide, ça fonctionne.

Par contre comment faire pour ne prendre en compte que le deuxième paramètre ? Y a-t-il moyen de ne lui faire prendre en compte que le deuxième ou faut-il s'arranger pour que le premier n'affiche rien en lui disant d'interdire tous les caractères (j'ai essayé (.^) mais ça n'a pas marché) ?
 
WRInaute accro
De rien.
Pas de souci : dans ta règle, tu ne fais pas mention de $1 :

Code:
RewriteRule ^(.*).html$ /test/cms/index.php?id=$1&titre=$2 [L]

Par contre tu t'exposes à un risque, si les deux titres sont les mêmes après transformation. L'avantage de l'identifiant dans l'URL est qu'il est unique (enfin je pense qu'il s'agit d'un identifiant unique)
 
Nouveau WRInaute
Quand je mets ce code, il se plante lors de l'affichage de la page à la requête SQL. La redirection fonctionne mais plus l'affichage de la page car il ne récupère plus l'id (qui effectivement est unique) mais le titre à la place.

De plus, lorsque j'essaye de mettre (-[a-z]*) pour afficher les tirets en plus des lettres, cela ne fonctionne pas non plus.

J'espère que je n'abuse pas de ton aide :oops:
 
Nouveau WRInaute
J'ai résolu le problème du tiret. Il fallait mettre ([-a-z]*) et pas (-[a-z]*).

Reste le problème consistant à enlever ignorer le premier paramètre...
 
WRInaute accro
C'est sur que si l'affichage du contenu associé est basé sur la récupération de l'Id, si tu ne le fais pas passer, tu ne pourras pas afficher ton contenu. il te faudrait modifier le code d'affichage de la page pour qu'il aille chercher le contenu dans la base en se fiant au titre passé; bref, une usine à gaz avec beaucoup de paramètres à prendre en compte. Pouruqoi ne veux-tu pas faire passer l'identifiant unique dans ton URL ?
 
Nouveau WRInaute
Juste une question d'avoir une adresse la plus propre possible. Je préfère une adresse du type contact.html que 5-contact.html par exemple. Maintenant si ce n'est pas possible, je devrai bien m'y résoudre...
 
Nouveau WRInaute
J'ai trouvé la solution :

Pour ceux qui qui voudraient savoir comment :

Dans l'ajout et la modification des articles :

Code :

$titreclean = strtolower($_POST["txtTitre"]);
$remplacements = array(' ' => '-', '\'' => '-', 'é' => 'e', 'è' => 'e', 'à' => 'a', 'ù' => 'u', 'ê' => 'e', 'â' => 'a', 'ç' => 'c', 'û' => 'u', 'ô' => 'o', 'ë;' => 'e', 'î' => 'i', 'ï' => 'i', 'ü' => 'u');
$titreclean = strtr($titreclean, $remplacements);

Le titre clean s'enregistre dans un champ dédié de la base de donnée.

Dans l'affichage :

Code :

<li><a href="<?php echo $row["titreclean"] ; ?>.html"><?php echo $row["titre"] ; ?></a></li>

J'obtiens le titre retravaillé par l'URL rewriting suivant :

Code :

RewriteRule ^([-a-z]*).html$ /test/cms/index.php?titre=$1 [L]

Encore un tout grand merci !
 
Discussions similaires
Haut