Nginx: URL de redirecionamento para sempre incluir um prefixo de localidade

Nginx: URL de redirecionamento para sempre incluir um prefixo de localidade

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 locationdiretiva:

location /en/ {
   try_files $uri $uri/ =404;
}

location / {
   return 301 /en$uri;
}

informação relacionada