Cómo utilizar .htaccess para redireccionar todos menos uno subdirectorio
Pregunta
Ha sido un tiempo desde que he metido con .htaccess y me parece que no puede obtener esta todo bien. Tengo un sitio, por ejemplo example.com, donde quiero example.com/* para redirigir a example.com/collector.html excepto para URL bajo el subdirectorio example.com/special, que quiero para seguir trabajando.
Por ejemplo:
- example.com/page.html debe redirigir a example.com/collector.html
- example.com/foo/bar debe redirigir a example.com/collector.html
- example.com/special/page.html no debe redirigir
Me habría pensado que algo así
RedirectMatch 302 ^/[^(special)]/.* /collector.html
RedirectMatch 302 ^/[^(collector.html)/]* /collector.html
que hacer el truco, pero no parece funcionar de la manera que quiero que haga.
Solución
Tal vez esto? (Necesita mod_rewrite)
RewriteEngine On
RewriteRule !^(special(/.*)?|collector\.html)$ collector.html [R,L]
Otros consejos
Esto funciona muy bien para mí en Apache 2.2.13 en el que recreó la estructura de directorios que usted describió.
RedirectMatch 302 /(?!special) http://www.example.com/collector.html
El patrón de los soportes está diciendo no coinciden si el URI contiene la cadena 'especial'.
También mod reescribir no siempre está disponible y en este caso no es necesario.
Prueba esto:
RedirectMatch 302 /\/[^(special)]\/.+/ /collector.html
RedirectMatch 302 /\/[^(collector\.html)]/ /collector.html
Tal vez ...?
RewriteEngine on
RewriteRule ^(?!special) collector.html [R,NC]