mod_rewrite regla para redirigir todas las solicitudes, salvo para una ruta específica

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy tratando de redirigir todas las peticiones a mi dominio a otro dominio con mod_rewrite en Apache 2.2 VirtualHost declaración.Hay una excepción a esto -- me gustaría que todas las peticiones a la /audio camino no para ser redirigido.

He escrito un RewriteCond y RewriteRule para hacer esto, pero no es muy correcta y no puedo entender por qué.La expresión regular contiene un negativo de búsqueda hacia delante de la cadena "/" audio", pero por alguna razón esto no es coincidencia.He aquí la definición:

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

Si puedo cambiar el RewriteCond a:

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

(es decir,poner la barra diagonal fuera de la negativa de oteo parte) entonces funciona, pero la desventaja de esto es que las solicitudes para mydomain.net sin una barra al final no va a ser redirigido.

Puede alguien señalar lo que estoy haciendo mal?

(Nota:los corchetes alrededor del dominio en el RewriteRule poco por encima de la que se añaden por StackOverflow.com -- no hay en el código real!)


Aquí están las reglas:

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

Gracias @mercucio, que hace perfecto sentido, pero todavía no parece funcionar.

Aquí está lo que el mod_rewrite de registro dice que cuando puedo presentar una solicitud para 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]

Desde el REQUEST_URI empieza con /audio Yo esperaría que el RewriteRule a ser ignorado.

¿Fue útil?

Solución

El HTTP_HOST sólo contiene el nombre de host, no la ruta de acceso de la dirección URL solicitada.

RewriteCond %{REQUEST_URI} !^/audio

Debe ser todo lo que usted necesita.

Además, puede obtener información de depuración desde el motor de reescritura con la siguiente, que es realmente útil para ver cómo sus condiciones y normas que se están emparejados:

RewriteLog /path/to/log/file
RewriteLogLevel 3
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top