mod_rewrite: a página da web tem um loop de redirecionamento

mod_rewrite: a página da web tem um loop de redirecionamento

Estou tentando ter um parâmetro que venha logo após o nome do host, como em:

www.domain.com/parameter

Por esse motivo, defini a seguinte rewriteRule para dois valores de parâmetros com os quais gostaria de operar:

RewriteRule ^(en|pt)$ /index.php?language=$1&%{QUERY_STRING} [L]

Funciona bem! Porém, preciso criar uma nova regra para redirecionar qualquer solicitação sem um dos parâmetros listados.

Por esse motivo, pensei que isso funcionaria:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

Mas infelizmente está mostrando um loop de redirecionamento.

Eu tenho recebido:

http://hostname/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt//

Qualquer dica sobre como consertar isso será apreciada!

Responder1

Isso é porquediretóriosnão sãoarquivos normais.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html(sem HTML DOM idpara o snippet! O mais próximo é um não relacionado LA-U, mesmo o que deveria ser um id="LA-F"está faltando!)

Você pode realizar vários testes de atributos de arquivo:

'-d' (is directory)
Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
'-f' (is regular file)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

Desde que o resto da sua configuração esteja correto (não tenho certeza se adicionar uma barra final é uma boa ideia), você deve adicionar uma condição extra para !-d:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

Além disso, considere mudar para o nginx! Não só possui uma sintaxe mais clara, mais voltada para o uso comum, mas também possui links diretos para documentação relevante, como esta -http://nginx.org/r/if.

verificação da existência de arquivo, diretório ou link simbólico com os operadores “-e” e “!-e”;

Responder2

%{REQUEST_URI}é o caminho do URI logo após o nome do host, portanto, ele começa com a barra:/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(en|pt)$
RewriteRule ^.*$ /pt/$0/ [R=301,L]

informação relacionada