mod_rewrite: página da web tem um loop de redirecionamento [duplicado]

1

Estou tentando ter um parâmetro que vem logo após o hostname, como em:

www.domain.com/parameter

Por esse motivo, configurei o seguinte rewriteRule para dois valores de parâmetro com os quais gostaria de operar:

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

Funciona bem! Embora eu precise 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//

Todas as dicas sobre como corrigir isso são bem-vindas!

    
por punkbit 11.10.2015 / 22:26

2 respostas

2

Isso porque diretórios não são arquivos regulares .

link (não há HTML DOM id para o snippet! o mais próximo é um não relacionado LA-U , mesmo o que deveria ter sido um id="LA-F" está faltando!)

You can perform various file attribute tests:

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

Se o resto da sua configuração estiver correta (não tenho certeza de que adicionar uma barra à direita é uma boa ideia), adicione 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ó tem uma sintaxe mais clara, mais voltada para o uso comum, mas também tem links diretos para a documentação relevante, como - link .

checking of a file, directory, or symbolic link existence with the “-e” and “!-e” operators;

    
por 11.10.2015 / 23:09
0

%{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]
    
por 12.10.2015 / 14:44