regola mod_rewrite per reindirizzare tutte le richieste tranne un percorso specifico

StackOverflow https://stackoverflow.com/questions/19493

  •  09-06-2019
  •  | 
  •  

Domanda

Sto cercando di reindirizzare tutte le richieste al mio dominio su un altro dominio utilizzando mod_rewrite in una dichiarazione VirtualHost Apache 2.2.C'è un'eccezione a questo: vorrei che tutte le richieste fossero indirizzate a /audio sentiero non essere reindirizzato.

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

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

Se cambio RewriteCond in:

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

(cioè.metti la barra al di fuori della parte lookahead negativa) allora funziona, ma lo svantaggio è che le richieste a miodominio.net senza una barra finale non verranno reindirizzate.

Qualcuno può farmi notare cosa sto facendo di sbagliato?

(Nota:le parentesi angolari attorno al dominio nel bit RewriteRule sopra sono state aggiunte da StackOverflow.com - non sono presenti nel codice effettivo!)


Ecco le regole:

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

Grazie @mercutio: ha perfettamente senso ma non sembra ancora funzionare.

Ecco cosa dice il registro mod_rewrite quando faccio una richiesta a http://miodominio.net/audio/qualcosa.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]

Poiché REQUEST_URI inizia con /audio Mi aspetterei che RewriteRule venisse ignorato.

È stato utile?

Soluzione

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

RewriteCond %{REQUEST_URI} !^/audio

Dovrebbe essere tutto ciò di cui hai bisogno.

Inoltre, puoi ottenere informazioni di debug dal motore di riscrittura con quanto segue, che è davvero utile per vedere come vengono soddisfatte le tue condizioni e regole:

RewriteLog /path/to/log/file
RewriteLogLevel 3
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top