160 votes

.htaccess mod_rewrite - comment exclure un répertoire de la règle de réécriture ?

J'ai 8 lignes de règles de réécriture dans mon fichier .htaccess. J'ai besoin d'exclure deux répertoires physiques de mon serveur de ces règles, afin qu'ils puissent devenir accessibles. Pour l'instant, toutes les demandes sont envoyées au fichier index.php.

Répertoires à exclure : "admin" et "user".

Donc les requêtes http : http://www.domain.com/admin/ ne doit pas être transmis au fichier index.php.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

0 votes

Je pense que tu as oublié les quantificateurs après [^/] puisqu'un simple espace n'est pas autorisé à cet endroit (il doit être échappé avec le symbole \<space> ).

0 votes

C'est vrai Gumbo, bien vu :). ça devrait être ^([^/]+).

317voto

Gumbo Points 279147

Essayez cette règle avant vos autres règles :

RewriteRule ^(admin|user)($|/) - [L]

Cela mettra fin au processus de réécriture.

0 votes

Bonjour Gumbo, votre code fonctionne si l'utilisateur tape domain.com/admin/ (avec le slash final) mais pas sans. Que faut-il changer pour que les deux cas fonctionnent ? Merci

0 votes

@Kelvin : L'alternance ($|/) doit gérer les deux cas.

0 votes

N'est-il pas préférable d'utiliser RewriteCond ici au lieu de RewriteRule ?

125voto

109830487515325 Points 158

Ce que vous pouvez également faire est de mettre un fichier .htaccess contenant

RewriteEngine Off

Dans les dossiers que vous voulez empêcher d'être réécrits (par les règles d'un fichier .htaccess situé plus haut dans l'arborescence). Simple mais efficace.

23 votes

+1 ~ .htaccess fonctionne de manière hiérarchique, de sorte que les dossiers locaux remplacent leurs parents, tout comme une cascade normale en CSS ou MVC.

7 votes

Il n'y a qu'une seule chose que vous devez avoir à l'esprit : activer les fichiers .htaccess (définir AllowOverride à autre chose que None dans la configuration d'apache) force apache à rechercher le .htaccess à chaque requête. donc si vous avez un site web/ serveur web très fréquenté, cet accès au système de fichiers/disque dur pourrait avoir un impact important sur les performances...

0 votes

Un conseil parfait pour valider le renouvellement des certificats SSL via la méthode des fichiers. Pas besoin de modifier quoi que ce soit en dehors des répertoires temporaires, ou dans le fichier vhost. Une fois la validation effectuée, il suffit de supprimer tout le dossier et le tour est joué. Tout simplement génial.

29voto

Rob Points 3582

Ajouter une condition pour vérifier le répertoire d'administration, quelque chose comme :

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

0 votes

Bonjour Rob, j'ai mis cette ligne juste après "RewriteBase /", et maintenant j'obtiens "500 Error - Internal Server Error".

0 votes

@Kelvin J'ai modifié ma réponse, ajoutez la condition avant chaque règle à laquelle vous voulez qu'elle s'applique.

0 votes

Celui-ci est le seul qui m'ait vraiment aidé. Le site réponse acceptée a fait pas aidez-moi.

6voto

Camilo Tilaguy Points 61

Nous avons utilisé la règle mod_rewrite suivante :

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Cela redirige (de façon permanente avec une redirection 301) tout le trafic vers le site vers http://www.newdomain.com à l'exception des demandes de ressources dans les répertoires /test et /my-folder. Nous transférons l'utilisateur vers la ressource exacte qu'il a demandée en utilisant le groupe de capture (.*) puis en incluant $1 dans la nouvelle URL. Attention aux espaces.

6voto

starkeen Points 29161

Si vous souhaitez supprimer un répertoire particulier de la règle (c'est-à-dire que vous souhaitez supprimer le répertoire foo ) ,vous pouvez utiliser :

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

La rewriteRule ci-dessus va réécrire toutes les requêtes à /index.php à l'exclusion des demandes de /foo/ .

Pour exclure toutes les directoires existantes, vous devrez utiliser la condition suivante au-dessus de votre règle :

RewriteCond %{REQUEST_FILENAME} !-d

la règle suivante

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

réécrit tout (sauf les directoires) en /index.php .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X