Precedência de RewriteRules no arquivo .htaccess no Apache Server

4

Eu tenho um número de RewriteRules no meu arquivo .htaccess. No entanto, uma regra específica só é executada se eu remover outra regra específica, independentemente de como eu ordeno as duas regras.

Aqui está a regra que parece ter prioridade "inferior":

RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L]

E aqui está a regra que sempre tem precedência:

RewriteCond %{HTTP_HOST} ^domain1\.net$ [NC]
RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L]

Tanto o domínio1 quanto o domínio2 apontam para o mesmo site. Então, sempre que ambas as regras estiverem no arquivo .htaccess e eu acessar

http://domain1.net/123

A segunda regra é executada primeiro e eu recebo dois redirecionamentos, primeiro para o link e depois (quando o nome do host não se encaixa no segunda regra mais) para o link . Eu tentei consertar a segunda regra, então ela nunca é executada para URLs que contêm apenas números, mas eu devo estar fazendo algo errado, porque ainda é executado:

RewriteCond %{HTTP_HOST} ^ domain1\.net$ [NC]
RewriteRule ^(.*[^0-9]+.*)$ http://domain2.net/$1 [R=301,L]

Somente removendo as duas linhas do arquivo .htaccess, posso obter a primeira regra para lidar com a solicitação imediatamente.

Qualquer ajuda seria muito apreciada.

    
por LKM 27.08.2009 / 19:33

2 respostas

3

Suas regras indicam esses procedimentos:

If the URL is only numbers, go to the beta URL followed by those numbers and stop.

If you visit domain1, go to the same URL at domain2 and stop.

Quando um L é encontrado ou as regras são concluídas, o processamento é finalizado. Qualquer outra coisa acontecendo é uma nova conexão do navegador. Isso é provavelmente o que é confuso para você - a ordem é importante, depois as correspondências. O L deve cuidar do problema que você tem quando está em ordem:

RewriteEngine on

RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L] # end of processing [L] if it's only numeric

RewriteCond %{HTTP_HOST} ^domain1\.net$ [NC] # if case-insensitive match of domain1.net…

RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L] # redirect to domain2.net. End [L]

    
por 27.08.2009 / 20:39
2

Acho que você deve verificar os sinalizadores das regras de regravação ( link ) atenção para o que as bandeiras C e L fazem.

    
por 27.08.2009 / 19:56