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

145

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

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

Ainsi, les requêtes http: http://www.domain.com/admin/ ne doivent pas être transmises 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]
Kelvin
la source
Je pense que vous avez oublié les quantificateurs après [^/]car un espace simple s'il n'y est pas autorisé (il faut l'échapper avec \<space>).
Gumbo
True Gumbo, bonne prise :). ce devrait être ^ ([^ /] +).
Kelvin

Réponses:

287

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

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

Cela mettra fin au processus de réécriture.

Gombo
la source
Bonjour Gumbo, votre code fonctionnait si le type d'utilisateur domain.com/admin/ (avec barre oblique de fin) mais pas sans. Avez-vous ce qui peut être changé pour que les deux cas fonctionnent? Merci
Kelvin
@Kelvin: L'alternance ($|/)doit gérer les deux cas.
Gumbo
N'est-il pas préférable d'utiliser RewriteCond ici au lieu de RewriteRule?
rineez
7
@rineez RewriteCondnécessite toujours un RewriteRuleauquel il est attaché. Et ajouter cette condition comme une négation RewriteCondà tout RewriteRulepeut être assez volumineux, une seule RewriteRulecomme sortie au-dessus de celles qui devraient être ignorées dans un tel cas est plus élégante.
Gumbo
3
@Ergec Cela signifie «ne changez rien».
Gumbo le
112

Vous pouvez également mettre un fichier .htaccess contenant

RewriteEngine Off

Dans les dossiers que vous souhaitez exclure de la réécriture (par les règles d'un fichier .htaccess situé plus haut dans l'arborescence). Simple mais efficace.


la source
18
+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.
Atari
4
il n'y a qu'une chose que vous devriez avoir à l'esprit: l'activation des fichiers .htaccess (paramétrer AllowOverridesur autre chose que Nonedans la configuration apache) oblige apache à rechercher .htaccess à chaque requête. donc si vous avez un site Web / serveur Web très fréquenté, l'accès au système de fichiers / au disque dur pourrait avoir un impact considérable sur les performances ...
bohrsty
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 terminée, vous pouvez simplement supprimer tout le dossier et vous avez terminé. Tout simplement génial.
Countzero
25

ajoutez une condition pour vérifier le répertoire admin, 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]
Rob
la source
Bonjour Rob, j'ai mis cette ligne juste après "RewriteBase /", et maintenant j'obtiens "500 Error - Internal Server Error"
Kelvin
@Kelvin J'ai modifié ma réponse, ajoutez la condition avant chaque règle à laquelle vous voulez qu'elle s'applique.
Rob
Celui-ci était le seul qui m'a réellement aidé. La réponse acceptée ne m'a pas aidé.
Uwe Keim
5

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 réécrira toutes les requêtes dans /index.php à l' exclusion des requêtes pour / foo / .

Pour exclure tous les répertoires existants, 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 répertoires) dans /index.php .

Amit Verma
la source
5

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 requêtes vers les ressources des 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.

Camilo Tilaguy
la source
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
user3578691
la source