regola mod_rewrite per reindirizzare tutte le richieste eccetto per un percorso specifico


39

Sto provando a reindirizzare tutte le richieste al mio dominio in un altro dominio utilizzando mod_rewrite in una dichiarazione VirtualHost di Apache 2.2. C'è un'eccezione a questo - vorrei che tutte le richieste per il percorso /audionon venissero reindirizzate.

Ho scritto un RewriteCond e RewriteRule per fare questo, ma non è giusto e non riesco a capire perché. L'espressione regolare contiene un lookahead negativo per la stringa "/ audio", ma per qualche motivo questo non corrisponde. Ecco la definizione:

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

Se cambio la RewriteCond a:

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

(vale a dire mettere la barra al di fuori della parte negativa lookahead) allora funziona, ma il rovescio della medaglia è che le richieste a mydomain.net senza una barra finale non verrà reindirizzato.

Qualcuno può indicare cosa sto facendo male?

(Nota: le parentesi angolari intorno al dominio nel bit RewriteRule sopra vengono aggiunti da StackOverflow.com - non sono lì nel codice attuale)


Ecco le regole:

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

Grazie @mercutio - che ha perfettamente senso, ma ancora non sembrano funzionare.

Ecco cosa dice il registro mod_rewrite quando faccio una richiesta di 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] 

Dal momento che il REQUEST_URI si avvia con /audio mi aspetterei il RewriteRule per essere ignorato.

  0

applicando modello a uri '/ audio' Sembra che stia elaborando un modello diverso. O forse la logica è appena indietro ora. Puoi pubblicare il tuo set completo di regole? 21 ago. 082008-08-21 09:33:59

47

HTTP_HOST contiene solo il nome host, non il percorso dell'URL richiesto.

RewriteCond %{REQUEST_URI} !^/audio 

dovrebbe essere tutto il necessario.

Inoltre, è possibile ottenere informazioni di debug dal motore di riscrittura con la seguente, che è veramente utile per vedere come le condizioni e le regole vengono abbinati: '(. *)^$'

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

Dovresti aver modificato la tua risposta, invece di aggiungerne un'altra. 05 giu. 122012-06-05 00:46:00

  0

Aggiornamento: il RewriteCond è ancora corretto, ma nelle versioni di apache> = 2.4, RewriteLog non funziona più. Puoi impostare Loglevel in modo specifico su mod_rewrite con "LogLevel rewrite: trace3", ma poi devi guardare il ErrorLog per l'output. 07 dic. 172017-12-07 13:28:38