Aller au contenu

Sujets conseillés

Posté

Bonjour,

J'ai des pages qui sont nommées ainsi:

A-B-C.php
A-B-C1-C2.php
etc...

et je veux les reecrire en

C.php?s=B
C1-C2.php?s=B
etc...

J'applique la regle

RewriteRule ^A-(.*)-(.*)\.php$ $2.php?s=$1 [L]

Mais dans le cas ou j'ai C1-C2 , çà ne marche pas, pour quelle raison ?

Je contourne mon problème en faisant :

RewriteRule ^A-(.*)-(.*)-(.*)-(.*)-(.*)\.php$ $2-$3-$4-$5.php?s=$1 [L]
RewriteRule ^A-(.*)-(.*)-(.*)-(.*)\.php$ $2-$3-$4.php?s=$1 [L]
RewriteRule ^A-(.*)-(.*)-(.*)\.php$ $2-$3.php?s=$1 [L]
RewriteRule ^A-(.*)-(.*)\.php$ $2.php?s=$1 [L]

Mais ce n'est pas satisfaisant :whistling:

Posté

Dans le cas de A-B-C1-C2 tu as 3 parties variables, et ta règle n'en considère que deux... donc le premier (.*) va englober le plus possible de caractères, donc (B-C1)

Il faut faire précéder ta règle par une autre, qui dirait ceci:

RewriteRule ^A-(.+)-(.+)-(.+)\.php$ $2-$3.php?s=$1 [L]

Accessoirement j'ai remplacé tes * par le signe + ... vu que tu as au moins un caractère.

Tu devrais aussi remplacer le (.*) par ([^-]+) pour éviter "d'avaler" les - en cas de problème ;)

Posté

Oui en fait c'est ce que j'ai fait (cf mon message précédent, tu as du répondre pendant que je le modifiais ;) )

RewriteRule ^A-(.*)-(.*)-(.*)-(.*)-(.*)\.php$ $2-$3-$4-$5.php?s=$1 [L]
RewriteRule ^A-(.*)-(.*)-(.*)-(.*)\.php$ $2-$3-$4.php?s=$1 [L]
RewriteRule ^A-(.*)-(.*)-(.*)\.php$ $2-$3.php?s=$1 [L]
RewriteRule ^A-(.*)-(.*)\.php$ $2.php?s=$1 [L]

Je trouvais pas cette solution intellectuellement satisfaisante. Je me disais qu'il y avait peut-être moyen de lui dire d'englober d'abord à droite plutôt qu'a gauche ?

Merci pour ta réponse rapide

Posté

Qu'entends tu par "ça ne marche pas" (essaie au moins de dire ce qui se passe, une erreur 404 ?, il charge une autre page que ce que tu souhaites ?, ...) ?

Dans ta règle tu prévois une partie fixe et 2 paramètres séparés par des traits d'union ... lorsque tu essaie d'utiliser une URL comme "A-B-C1-C2.php" tu as un trait d'union de plus... le moteur d'expression régulière est gourmand (et le mod_rewrite ne permet pas de modifier ce comportement, contrairement à PHP par exemple)...

Tu utilises (.*) il va prendre le deuxième trait d'union comme faisant partie de ton premier paramètre ... et le deuxième paramètre sera "C2" (toujours avec l'exemple "A-B-C1-C2.php")... Pour changer ce comportement je te propose cette règle :

RewriteRule ^a-([^-]+)-(.+)\.php$ $2.php?s=$1 [L]

Ainsi ton premier paramètre ne DOIT par comprendre un trait d'union...et le deuxième paramètre lui peu en comprendre un si nécessaire.

En espérant avoir compris ce que tu voulais dire par "ça ne marche pas" :)

Bonne continuation.

EDIT : Bon j'arrive après la tempête... :lol: Pardon.

Posté

Un grand merci à vous deux :)

Effectivement ce qui me manquait TheRec c'est :

([^-]+)

Pour l'empêcher de globaliser sur B-C1 comme le signalait Dan, il suffit de lui dire qu'il n'y a pas de "-"

Super, mon code est maintenant plus propre !

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...