Estou tentando conseguir algo com nginx e regras de redirecionamento que parecem ser bastante simples, mas me deparei com um obstáculo.
Depois de analisar muitas perguntas e respostas, não consigo encontrar uma solução que funcione para mim.
O que eu quero alcançar é o seguinte:
Se alguém navegar até meu site com qualquer um dos seguintes URLs:
http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo
a pessoa será redirecionada para:
http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/
Isso é o que tenho em meu arquivo de configuração nginx até agora, na ordem em que os tenho no arquivo:
location ^/en/(.*) {
try_files $uri /index.php$is_args$args last;
}
location / {
if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
return 301 /en/$uri;
}
}
No entanto, com a configuração acima, estou entrando em um loop de redirecionamento infinito e a URL na barra de endereço termina assim antes que o servidor desista:
http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/
Alguém pode por favor:
a) Explique-me porque é que a minha configuração não teve o efeito pretendido para que eu possa compreendê-la e não repetir os mesmos erros no futuro
b) Propor uma solução que funcione e se possível melhorar minha configuração
c) Se possível, vá mais longe e explique com exemplos como posso fazer com que o nginx determine automaticamente a localidade associada à solicitação e transforme dinamicamente a solicitação para incluí-la da maneira descrita acima.
Obrigado
Responder1
Explique-me porque é que a minha configuração não teve o efeito pretendido para que eu possa compreendê-la e não repetir os mesmos erros no futuro
location ^/en/(.*)
não é uma directiva válida.
Você pode ter se confundido com location ^~ /en/(.*)
. Isso corresponde a qualquer consulta que comece com /en/
seguida de qualquer coisa.
Na verdade, request sempre corresponde à location /
diretiva para que você entre em um loop infinito.
Propor uma solução que funcione e, se possível, melhorar minha configuração
Basta usar o prefixo Path dentro da location
diretiva:
location /en/ {
try_files $uri $uri/ =404;
}
location / {
return 301 /en$uri;
}