regola mod_rewrite per reindirizzare tutte le richieste tranne un percorso specifico
-
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.
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