regra mod_rewrite para redirecionar todas as solicitações, exceto para um caminho específico

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou tentando redirecionar todas as solicitações do meu domínio para outro domínio usando mod_rewrite em uma declaração do Apache 2.2 VirtualHost.Há uma exceção a isso: gostaria que todas as solicitações ao /audio caminho não para ser redirecionado.

Eu escrevi um RewriteCond e um RewriteRule para fazer isso, mas não está certo e não consigo entender o porquê.A expressão regular contém um lookahead negativo para a string "/audio", mas por algum motivo isso não corresponde.Aqui está a definição:

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

Se eu alterar o RewriteCond para:

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

(ou seja,coloque a barra fora da parte negativa do lookahead), então funciona, mas a desvantagem disso é que as solicitações para mydomain.net sem uma barra final não serão redirecionadas.

Alguém pode apontar o que estou fazendo de errado?

(Observação:os colchetes angulares ao redor do domínio no bit RewriteRule acima estão sendo adicionados por StackOverflow.com - eles não estão lá no código real!)


Aqui estão as regras:

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

Obrigado @mercutio - faz todo o sentido, mas ainda parece não funcionar.

Aqui está o que o log do mod_rewrite diz quando faço uma solicitação para http://meudominio.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]

Como o REQUEST_URI começa com /audio Eu esperaria que o RewriteRule fosse ignorado.

Foi útil?

Solução

O HTTP_HOST contém apenas o nome do host, não o caminho da URL solicitada.

RewriteCond %{REQUEST_URI} !^/audio

Deve ser tudo que você precisa.

Além disso, você pode obter informações de depuração do mecanismo de reescrita com o seguinte, o que é realmente útil para ver como suas condições e regras estão sendo correspondidas:

RewriteLog /path/to/log/file
RewriteLogLevel 3
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top