2008-08-21 12 views
39

J'essaie de rediriger toutes les requêtes vers mon domaine vers un autre domaine en utilisant mod_rewrite dans une déclaration Apache 2.2 VirtualHost. Il y a une exception à cela - Je voudrais que toutes les demandes au /audio chemin pas à être redirigé.Règle mod_rewrite pour rediriger toutes les requêtes sauf pour un chemin spécifique

J'ai écrit un RewriteCond et RewriteRule pour le faire mais ce n'est pas tout à fait raison et je n'arrive pas à comprendre pourquoi. L'expression régulière contient un lookahead négatif pour la chaîne "/ audio", mais pour une raison quelconque, cela ne correspond pas. Voici la définition:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC] 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 

Si je change le RewriteCond à:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC] 

(c.-à-mettre la barre oblique en dehors de la partie préanalyse négative), il fonctionne, mais l'inconvénient est que les demandes à mydomain.net sans une barre oblique ne sera pas redirigé. Est-ce que quelqu'un peut signaler ce que je fais mal?

(Note: les crochets autour du domaine dans le bit RewriteRule ci-dessus sont ajoutées par StackOverflow.com - ils ne sont pas là dans le code réel)


Voici les règles:

<VirtualHost *:80> 
ServerAdmin [email protected] 
DocumentRoot "/var/www/mydomain.net/htdocs" 
ServerName www.mydomain.net 
ServerAlias mydomain.net 

RewriteEngine on 
RewriteCond {REQUEST_URI} !^/audio 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 
RewriteLog logs/mod_rewrite_log 
RewriteLogLevel 3 

ErrorLog logs/error_log 
CustomLog logs/access_log common 
</VirtualHost> 

Merci @mercutio - qui fait sens parfait, mais il semble ne pas encore au travail.

Voici ce que le journal mod_rewrite dit quand je fais une demande de http://mydomain.net/audio/something.mp3:

(2) init rewrite engine with requested uri /audio/something.mp3 
(3) applying pattern '^(.*)$' to uri '/audio' 
(2) rewrite '/audio' -> 'http://www.newdomain.net/' 
(2) explicitly forcing redirect with http://www.newdomain.net 
(1) escaping http://www.newdomain.net for redirect 
(1) redirect to http://www.newdomain.net [REDIRECT/301] 

Depuis le REQUEST_URI ne démarre avec /audio je me attends RewriteRule à être ignoré. Le HTTP_HOST contient uniquement le nom d'hôte, pas le chemin de l'URL demandée.

+0

application modèle à uri '/ audio' On dirait qu'il traite un motif différent. Ou peut-être que la logique est juste en arrière maintenant. Pouvez-vous poster votre ensemble complet de règles? – mercutio

Répondre

47

RewriteCond %{REQUEST_URI} !^/audio 

Doit être tout ce dont vous avez besoin.

De plus, vous pouvez obtenir les informations de débogage du moteur de réécriture avec ce qui suit, ce qui est vraiment utile de voir comment sont adaptées à vos conditions et règles: « (. *)^$ »

RewriteLog /path/to/log/file 
RewriteLogLevel 3 
+0

Vous auriez dû éditer votre réponse, au lieu d'en ajouter une autre. –

+0

Mise à jour: le RewriteCond est toujours correct, mais dans les versions de Apache> = 2.4, RewriteLog ne fonctionne plus. Vous pouvez définir Loglevel spécifique à mod_rewrite avec 'LogLevel rewrite: trace3', mais vous devez alors regarder le ErrorLog pour la sortie. – mightypile