2008-08-21 10 views
39

Ich versuche, alle Anfragen an meine Domain zu einer anderen Domäne mit mod_rewrite in einer Apache 2.2 VirtualHost Deklaration umzuleiten. Es gibt eine Ausnahme - ich möchte alle Anfragen an den /audio Pfad nicht umgeleitet werden.mod_rewrite Regel zum Umleiten aller Anfragen mit Ausnahme eines bestimmten Pfades

Ich habe eine RewriteCond und RewriteRule geschrieben, um dies zu tun, aber es ist nicht ganz richtig und ich kann nicht herausfinden, warum. Der reguläre Ausdruck enthält einen negativen Lookahead für die Zeichenfolge "/ audio", aber aus irgendeinem Grund stimmt dies nicht überein. Hier ist die Definition:

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

Wenn ich die RewriteCond zu ändern:

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

(dh setzen Sie den Schrägstrich außerhalb des negativen Look-Ahead-Teil), dann funktioniert es, aber die Kehrseite der Medaille ist, dass Anfragen zu mydomain.net ohne einen abschließenden Schrägstrich wird nicht umgeleitet.

Kann jemand darauf hinweisen, was ich falsch mache?

(Hinweis: die spitzen Klammern um die Domäne in der RewriteRule Bit durch StackOverflow.com oben hinzugefügt werden - sie sind dort nicht in den eigentlichen Code)


Hier sind die Regeln:

<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> 

Dank @mercutio -, die durchaus Sinn macht, aber es scheint immer noch nicht zu funktionieren.

Hier ist, was das mod_rewrite Protokoll sagt, wenn ich eine Anfrage an http://mydomain.net/audio/something.mp3 machen:

(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] 

Da die REQUEST_URI mit /audio läuft würde ich die RewriteRule ignoriert werden erwartet.

+0

Muster Anwendung zu uri '/ audio' Klingt, als ob es ein anderes Muster verarbeitet. Oder vielleicht ist die Logik jetzt gerade umgekehrt. Können Sie Ihre vollständigen Regeln veröffentlichen? – mercutio

Antwort

47

Der HTTP_HOST enthält nur den Hostnamen, nicht den Pfad der angeforderten URL.

RewriteCond %{REQUEST_URI} !^/audio 

Sollte alles sein, was Sie brauchen.

Darüber hinaus können Sie Debug-Informationen aus der Rewrite-Engine mit dem folgenden erhalten, die wirklich nützlich ist, um zu sehen, wie Sie Ihre Bedingungen und Regeln angepasst werden: ‚(. *)^$‘

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

Sie sollten Ihre Antwort bearbeitet haben, anstatt eine weitere hinzuzufügen. –

+0

Update: der RewriteCond ist immer noch korrekt, aber in Versionen von Apache> = 2.4 funktioniert RewriteLog nicht mehr. Sie können Loglevel für 'mod_rewrite' mit 'LogLevel rewrite: trace3' festlegen, müssen dann aber den ErrorLog für die Ausgabe beobachten. – mightypile