Frage

Ich versuche, alle Anfragen an meine Domäne mithilfe von mod_rewrite in einer Apache 2.2 VirtualHost-Deklaration an eine andere Domäne umzuleiten.Es gibt eine Ausnahme hiervon – ich möchte alle Anfragen an die /audio Weg nicht umgeleitet werden.

Ich habe dafür ein RewriteCond und ein RewriteRule geschrieben, 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 dieser 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 den RewriteCond in Folgendes ändere:

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

(d. h.Setzen Sie den Schrägstrich außerhalb des negativen Lookahead-Teils), dann funktioniert es, aber der Nachteil dabei ist, dass Anfragen an mydomain.net ohne abschließenden Schrägstrich nicht umgeleitet werden.

Kann jemand darauf hinweisen, was ich falsch mache?

(Notiz:Die spitzen Klammern um die Domäne im RewriteRule-Bit oben werden von StackOverflow.com hinzugefügt – sie sind im eigentlichen Code nicht vorhanden!)


Hier sind die Regeln:

<VirtualHost *:80>
ServerAdmin me@mydomain.net
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>

Danke @mercutio – das macht durchaus Sinn, aber es scheint immer noch nicht zu funktionieren.

Hier ist, was im mod_rewrite-Protokoll steht, wenn ich eine Anfrage dazu stelle 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]

Da der REQUEST_URI mit beginnt /audio Ich würde erwarten, dass die RewriteRule ignoriert wird.

War es hilfreich?

Lösung

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 wie folgt Debug-Informationen von der Rewrite-Engine abrufen, was sehr nützlich ist, um zu sehen, wie Ihre Bedingungen und Regeln übereinstimmen:

RewriteLog /path/to/log/file
RewriteLogLevel 3
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top