htaccess-rewriting, mais excluant le sous-répertoire

J’ai une règle de réécriture générale dans la racine de mon site qui ressemble à ceci:

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1 

ce qui fonctionne bien pour réécrire des URL comme “www.example.com/myAction” pour “www.example.com/index.php?action=myAction”

Cela doit restr comme ça, mais je dois exclure un sous-répertoire (“/ login”) de la réécriture.

J’ai donc essayé:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/login/ RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1 

mais toujours pas de chance. J’ai lu plusieurs réponses ici sur SO mais je ne peux pas trouver la faille. Des idées? Je vous remercie!

Vous avez une barre oblique supplémentaire. .htaccess n’utilise pas la barre oblique précédente contrairement à un Virtual Host . Aussi /login/ est un répertoire. Donc, vous correspondez à tout ce qui n’est pas un fichier réel, mais pourrait éventuellement être un vrai répertoire. Donc, si par exemple ‘/ css /’ existe, vous le réécrivez en index.php en tant qu’action sur demande.

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^login/ RewriteRule ^([^/]+) index.php?action=$1 

Si vous agissez encore de manière inattendue, vous devrez vous assurer de ne pas réécrire les répertoires existants et essayez ceci:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^login/ RewriteRule ^([^/]+) index.php?action=$1 

J’ai également remarqué que vous ne capturez que la première barre oblique (éventuellement) avec votre exemple de code affiché, puisque vous utilisez le code ? recherche, donc dans ma précédente mise en page, je montre ce code un peu plus court. Pour capturer l’ URI complet, utilisez ceci:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^login/ RewriteRule ^(.*) index.php?action=$1 

Pour capturer une deuxième (et troisième) chaîne, vous pouvez faire quelque chose comme ceci:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^login/ RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?action=$1&page=$2&response=$3 

Ce que vous avez devrait fonctionner, mais vous pouvez aussi essayer de faire passer toutes les demandes de /login/ à la place:

 RewriteEngine On RewriteRule ^login/? - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1