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

1

Estou tentando conseguir algo com as regras do nginx e do redirecionamento, o que parece 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 para o 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/

Isto é o que eu tenho no meu arquivo de configuração nginx até agora na ordem em que eu 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 correndo em um loop de redirecionamento infinito e a URL na barra de endereços 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 por que minha configuração não teve o efeito desejado para que eu possa entendê-la e não repetir os mesmos erros no futuro

b) Proponha uma solução que funcione e, se possível, melhore a minha configuração

c) Se possível, vá mais além e explique com exemplos como eu 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

    
por newbie 14.06.2015 / 16:14

1 resposta

2

Explain to me why my configuration has not had the intended effect so I can understand it and not repeat the same errors in the future

location ^/en/(.*) não é uma diretiva válida.

Você pode ter sido confundido com location ^~ /en/(.*) . Isso corresponde a qualquer consulta que comece com /en/ seguido por qualquer coisa.

Na verdade, a solicitação sempre corresponde à diretiva location / para que ela apresente um loop infinito.

Propose a solution that works and if possible improve upon my configuration

Basta usar o prefixo Path na diretiva location :

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

location / {
   return 301 /en$uri;
}
    
por 14.06.2015 / 18:42