[Résolu] Url rewriting, conditions négatives et autres

Nouveau WRInaute
Bonjours à tous, j'ai actuellement quelques petits problèmes pour mettre en place une url rewriting.
Voila le problème :

Ma ré-écriture convertit :
www.monsite.com/Page-Action-Id
En :
www.monsite.com/Index.php?page=Page&action=Action&id=Id
Ou les mots soulignés sont évidement mes variables.

Ma Regex de base :
Code:
RewriteRule ^(.+)$ Index.php?page=$1 [L]
RewriteRule ^(.+)-(.+)$ Index.php?page=$1&action=$2 [L]
RewriteRule ^(.+)-(.+)-(.+)$ Index.php?page=$1&action=$2&id=$3 [L]

Chaque ligne est prévue pour un nombre de variables à passer (page seul, page et action, ou les trois réunis).
Le problème c'est qu'avec ce genre de code, l'url des fichiers "inclus" étaient aussi ré-écrits (vu que je n'ai pas de signe distinctif pour les pages à re-écrire tel qu'un "page-" au début de chaque url).

Donc j'ai rajouté :
Code:
RewriteCond %{REQUEST_URI} !(Modules|Pages|Images|Fichiers|Style) [NC]
RewriteCond %{REQUEST_URI} !.*/$ [NC]
RewriteCond %{REQUEST_URI} !.*\..{2,4}$ [NC]
Afin d'éviter que les url vers un répertoire du site, ou contenant une extension, ou finissant par un slash (racine d'un répertoire) soient ré-écrites.

Mais un souci persiste.
Mes regex utilisent le point afin de ne pas se prendre la tête avec tout ce qui est caractères spéciaux, mais par conséquant ne font pas la différence quand se trouve un tiret (qui est censé séparer deux variables GET).

Quand la seconde ou troisième ligne devrait prendre le relai, la première garde la priorité.
Code:
RewriteRule ^(.+)$ Index.php?page=$1 [L]
RewriteRule ^(.+)-(.+)$ Index.php?page=$1&action=$2 [L]
RewriteRule ^(.+)-(.+)-(.+)$ Index.php?page=$1&action=$2&id=$3 [L]
Le point prend aussi le tiret donc la première ligne est valable en permanence.

J'ai bien essayé de modifier en :
Code:
RewriteRule ^([[^\-].]+)$ Index.php?page=$1 [L]
Ou bien :
Code:
RewriteRule ^(([^\-]|.)+)$ Index.php?page=$1 [L]
Mais ca ne fonctionne pas (ca devrait pourtant, non ?) oO

Bref, je serais particulièrement reconnaissant si une âme charitable habitué aux méandres de l'url rewriting me filait un petit coup de main, que la je sèche. ^^
 
WRInaute passionné
Les règles sont évaluées dans l'ordre. La première qui "match" est retenue. Il faut donc mettre les règles de la plus précise à la plus générale.
Pour éviter de réécrire les répertoires ou les fichiers existants il faut ajouter deux conditions.
Pour "n'importe quel caractère différent de -" il faut mettre "[^-]" à la place de "." (si les paramètres ne contiennent jamais de "-")
Code:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)-(.+)-(.+)$ Index.php?page=$1&action=$2&id=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)-(.+)$ Index.php?page=$1&action=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ Index.php?page=$1 [L]
 
Nouveau WRInaute
Problème résolu, donc. Grand merci à toi.

Et à tous les autres qui pourraient passer derrière, à retenir :
- Dans une regex, une condition négative se suffit à elle même (inutile de préciser le "ou tout").
- La règle d'url rewriting la plus haut est prise en priorité sur les autres (quand "[L]" qui stipule qu'une seule règle doit s'appliquer par ré-écriture).
- Les tags "!-d" et "!-f" d'une con RewriteCond permettent d'éviter le ciblage de certains éléments (inclus dans une page, répertoire ? A voir).
 
Discussions similaires
Haut