mod_rewrite semble ignorer le drapeau

J’essaie d’utiliser le drapeau [L] dans RewriteRule , mais cela ne semble pas fonctionner. Je voudrais ça si vous appelez la page:

 www.domain.com/admin/

il vous redirige vers:

 www.domain.com/backend.php

Sinon, si vous appelez une autre page (sauf pour certaines pages), elle redirige vers:

 www.domain.com/index.php

Voici ce que j’ai jusqu’ici:

 RewriteEngine on RewriteRule ^admin/(.*) /backend.php/$1 [L] RewriteCond $1 !^(index\.php|admin|assets|images|uploads|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L] 

Si je n’utilise que la première règle, cela fonctionne (mais ne redirige évidemment pas les autres pages vers index.php). Si j’ajoute la deuxième règle, le serveur semble ignorer la première règle (je pense qu’il est “écrasé” par la deuxième règle, même si j’ai ajouté le drapeau [L] )

Ce n’est pas comme ça que L fonctionne. Le moteur de réécriture parcourra continuellement toutes les règles jusqu’à ce que l’URI entrant dans le moteur soit identique à celui qui sortira. Le L indique simplement au moteur de réécriture d’arrêter d’appliquer des règles dans l’itération de la boucle en cours . Alors dis que tu as:

 RewriteRule ^(.*)$ /foo/$1 [L] RewriteRule ^(.*)$ /bar/$1 [L] 

après 1 itération, compte tenu de l’URI /blah , j’obtiens /foo/blah car il arrête de réécrire après la première règle (mais continuera toujours à boucler). Si je retire le L :

 RewriteRule ^(.*)$ /foo/$1 RewriteRule ^(.*)$ /bar/$1 

après 1 itération, étant donné l’URI /blah , j’obtiens /bar/foo/blah . Les deux règles sont appliquées l’une après l’autre car le L n’est pas là pour l’arrêter.

Vous devez append une condition dans votre deuxième règle pour l’empêcher de réécrire la première, ou l’une des deux fera:

 RewriteCond $1 !^(backend\.php|index\.php|admin|assets|images|uploads|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L] 

ou:

 RewriteCond %{ENV:REDIRECT_STATUS} !200 RewriteCond $1 !^(index\.php|admin|assets|images|uploads|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L] 

Votre seconde règle est étrange. Je ne sais pas ce que vous essayez de faire en mettant $1 comme valeur contre laquelle vous vérifiez votre condition. Il devrait probablement ressembler à ceci:

RewriteEngine on

RewriteRule ^ admin /(.*) /backend.php/$1 [L]

RewriteCond% {REQUEST_FILENAME}! ^ (Index.php | admin | assets | images | uploads | robots.txt | backend.php) RewriteRule ^ (. *) $ /Index.php/$1 [L]

Remarque J’ai également ajouté un pass-through pour backend.php