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 id
para 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]