2012-04-12 3 views
1

Dans l'un de mes projets, j'essaie de rediriger l'utilisation de .htaccess. J'utilise une redirection comme ceci:Redirection .htaccess avec exception

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

Mais, maintenant, je voudrais ajouter une exception aux règles de réécriture. Je veux que http://example.com/admin/ soit redirigé de la même manière, seulement vers un répertoire différent. Tout le reste du trafic devrait toujours aller dans le répertoire public. J'ai donc ajouté une condition de réécriture comme ceci:

RewriteCond %{REQUEST_URI} !/admin/ 
RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

Ceci n'a pas fait l'affaire. Je suis toujours redirigé vers le dossier public. J'ai également essayé ceci:

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

RewriteCond %{REQUEST_URI} !/admin 
RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

Cela n'a fait qu'empirer les choses. Je reçois maintenant une erreur interne de 500 serveurs.

Cela fait maintenant des heures que je cherche, et je commence à en avoir assez de trouver des exemples qui montrent comment ajouter une exception pour un certain dossier, mais je ne montre pas comment rediriger ce trafic vers un autre dossier. Pouvez-vous me dire ce que je fais mal, ou quelle autre approche je pourrais essayer?

Répondre

5

Un RewriteCond s'applique uniquement à la règle directement en dessous. En d'autres termes, dans votre exemple, il s'applique uniquement à la règle de chemin vide. Déplacez le RewriteCond vers le bas d'un cran, et cela fonctionnera mieux.

RewriteRule ^$ public/ [L] 

RewriteCond %{REQUEST_URI} !/admin/ 
RewriteRule (.*) public/$1 [L] 

De plus, je trouve votre règle

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

être impair. Une URL comme /adminsomething sera réécrite en /admin/something, ce que je ne pense pas être ce que vous voulez.

De plus, j'ai le pressentiment que vous confondez un rewrite avec un redirect. Une réécriture est une règle qui permet de réécrire une requête en interne et de l'interpréter différemment. Une redirection est une règle qui indique au navigateur du visiteur d'aller à une autre adresse. Lequel allez-vous?

Le mot-clé magique d'une redirection est R=301, ce qui signifie une redirection avec le code http 301 déplacé définitivement. Par exemple, vous voudrez peut-être essayer ...

# This first rule is actually redundant in this case so skip it... 
#RewriteRule ^$ public/ [R=301,L] 
RewriteCond %{REQUEST_URI} !/admin 
RewriteRule (.*) public/$1 [R=301,L] 
+0

La chose d'administration était juste une faute de frappe. J'ai oublié le slash. J'ai déplacé le RewriteCond vers le bas une règle et tout fonctionne comme je le veux. Je pense que je cherchais une règle de réécriture, car elle devrait être traitée en interne. –