Url-Rewriting comment arrêter la vérification des autres exp dès qu'une est satisfaite

WRInaute discret
Bonjour,

J'effectue l'url rewriting de mon site, le soucis c'est qu'il faut toujours commenter la dernière expression pour que le htaccess soit OK
Code:
RewriteRule ^madagascar-(.*)-(.*)-(.*)-(.*)$ index.php/contenu/$1_$2_$3_$4 [L]
RewriteRule ^madagascar-(.*)-(.*)-(.*)$ index.php/contenu/$1_$2_$3 [L]
RewriteRule ^madagascar-(.*)-(.*)$ index.php/contenu/$1_$2 [L]
RewriteRule ^madagascar-(.*)$ index.php/contenu/$1 [L]
RewriteRule (.*)(?!index\.php/)(.+)$ index.php/$0 [L]
Il faut donc faire #RewriteRule (.*)(?!index\.php/)(.+)$ index.php/$0 [L]
Je me demande, est-ce que [L] n'arrête pas la lecture des lignes suivantes dès que son expression est exacte?
Le soucis aussi c'est que la dernière ne marche pas que quand les expressions d'avant commentés. Cette dernière consiste à mettre index.php après le nom de domaine pour les url qui n'en contiennent pas.
 
WRInaute accro
Oui, [L] devrait le faire s'arrêter là. Mais je ne suis pas convaincu que ta dernière ligne fasse ce que tu veux, je pense que tu devrais relire la doc pour (?!), parce qu'un negative look-ahead c'est un truc plus subtil qu'il n'y paraît, et en gros, ta regex correspond à tout ce qui fait au moins un caractère, y compris ce qui contient index.php.

Au passage, quel est l'intérêt de rajouter le index.php?

Jacques.
 
WRInaute discret
Oui c'est ça ce que je cherchais à faire dans la dernière ligne: ajouter index.php à l'url qui ne l'a pas!
Le vrai URL compréhensible par mon framework php (codeigniter) est du genre domainte_site_web/index.php/article/environment

Ce que je ne comprends pas du tout c'est que le [L] ne semble pas arrêter le rewriting car par exemple si RewriteRule ^madagascar-(.*)-(.*)-(.*)-(.*)$ index.php/contenu/$1_$2_$3_$4 [L] s'effectue, ça passe toujours vers la dernière ligne, ce qui m'a obligé à commenter cette dernière alors que ça m'est utile
 
WRInaute accro
Comme déjà indiqué, je doute fortement que ta dernière ligne fasse ce que tu veux, je pense que ça va ajouter index.php même à des lignes qui ont déjà index.php.

Et qu'est-ce-qui te fait dire que si ton URL est "matchée" par une règle précédente la dernière règle s'applique quand même? Tu as un exemple d'URL et de ce qui se passe?

Jacques.
 
WRInaute discret
Jacques > Voici un exemple

L'URL /madagascar-produits-aux-paysans

Ca se match avec le RewriteRule n°2 non? Donc ça doit s'arrêter là, n'est-ce pas mais il s'avère que non et c'est vrai d'après le dire d'un expert

Envoyé par _Mac_
Le seul truc c'est que le [L] n'arrête pas le traitement de l'URL pour de bon : il va arrêter le cycle de réécriture en cours mais un suivant va recommencer. La réécriture d'URL ne s'arrêtera que lorsque l'URL d'entrée ne sera plus modifiée par les règles.
 
WRInaute accro
la meilleure solution pour vérifier tes règles consiste à mettre un [R=301,L] à chacune de tes règles et de vérifier si, déjà comme ça, la réécriture s'effectue correctement. Un fois OK, tu peux supprimer le R=301 de tes règles
 
WRInaute discret
Pas même besoin de ce [R=301,L] pour savoir que /madagascar-produits-aux-paysans répond à l'expression RewriteRule ^madagascar-(.*)-(.*)-(.*)-(.*)$ index.php/contenu/$1_$2_$3_$4 [L]

Mais bon comme la citation que j'ai envoyée [L] n'arrête pas le traitement de l'URL pour de bon

J'ai voulu remplacer RewriteRule (.*)(?!index\.php/)(.+)$ index.php/$0 [L] par
RewriteCond %{REQUEST_URL} !index\.php
RewriteRule (.*) index.php/$1 [L]
Mais ça marche pas
 
Discussions similaires
Haut