Como usar htaccess para redirecionar todos, mas um subdiretório
Pergunta
Tem sido um tempo desde que eu mexeu com .htaccess e eu não consigo obter esta muito bem. Eu tenho um site, dizer example.com, onde eu quero example.com/* para redirecionar para example.com/collector.html , exceto para URLs sob o subdiretório example.com/special, o que eu quero para continuar a trabalhar.
Por exemplo:
- example.com/page.html deve redirecionar para example.com/collector.html
- example.com/foo/bar deve redirecionar para example.com/collector.html
- example.com/special/page.html não deve redirecionamento
Eu teria pensado que algo como
RedirectMatch 302 ^/[^(special)]/.* /collector.html
RedirectMatch 302 ^/[^(collector.html)/]* /collector.html
faria o truque, mas não parecem funcionar da maneira que eu quero.
Solução
Talvez isso? (Necessidades mod_rewrite)
RewriteEngine On
RewriteRule !^(special(/.*)?|collector\.html)$ collector.html [R,L]
Outras dicas
Esta multa funciona para mim no Apache 2.2.13 onde eu recriou a estrutura de diretórios que você descreveu.
RedirectMatch 302 /(?!special) http://www.example.com/collector.html
O padrão entre parênteses está dizendo não correspondem se o URI contém a string 'especial'.
Além disso mod reescrever nem sempre está disponível e, neste caso, não é necessário.
Tente isto:
RedirectMatch 302 /\/[^(special)]\/.+/ /collector.html
RedirectMatch 302 /\/[^(collector\.html)]/ /collector.html
Talvez ...?
RewriteEngine on
RewriteRule ^(?!special) collector.html [R,NC]