Gostaria de abordar uma resposta mais recente baseada em regex que está crescendo em popularidade.
location ~ ^/en(/?)(.*)$ { # OOPS!
proxy_pass http://luscious/$2$is_args$args; # OOPS!
}
A solução pode parecer mais atraente à primeira vista, mas está errada por vários motivos.
O regex acima corresponderia a uma solicitação de uri /enjoy
, redirecionando-a para o /joy
upstream. Isso é realmente pretendido?
Uma solicitação para /en
não resultará em redirecionamentos, servindo diretamente a /
partir do upstream (quase como se uma solicitação /en/
fosse feita, mas não totalmente). Se você usar URIs relativos dentro da sua página raiz a montante (caso contrário, por que você não teria o /en/
prefixo ali dentro dos URIs upstream?), Por exemplo src="style.css"
(que pode fazer referência a um idioma específico url("menu.png")
, por exemplo), o navegador solicitará que como em /style.css
vez de /en/style.css
. (Ou mesmo se você usar URIs absolutos em todos os lugares, e se alguém fizer referência relativamente a um recurso semi-opcional obscuro?) Opa, de repente o site pode não funcionar, mas apenas às vezes ou em casos extremos.
Conforme meu conselho anterior em outra pergunta já mencionada pela resposta do OP , o uso de expressões regulares evita que a proxy_redirect
diretiva tenha o valor padrão de default
, diminuindo-o off
. Isso significa que, se o upstream responder Location: http://127.0.0.1:8080/en/dir/
quando um pedido /en/dir
for feito, é isso que o cliente verá, o que obviamente não funcionará corretamente. (O que seria especialmente irônico para uma /en
solicitação que solicita o uso de regex em primeiro lugar, mas essa implementação específica sofre com outro problema, como já mencionado acima.) Além disso, se você já estiver usando oupstream
diretiva, pode ficar ainda mais feio se você tentar usar um personalizado, especialmente se você tiver mais de um servidor upstream - como você tem um separado proxy_redirect
para cada um deles? Você também pode usar expressões regulares proxy_redirect
, talvez até para corresponder a qualquer host, mas e se você decidir redirecionar vários domínios no futuro?
Para tentar abordar alguns dos pontos acima com um único local baseado em regex, poderíamos fazer o seguinte (observe que proxy_pass
também tivemos que descartar a referência a um servidor de uma upstream
diretiva baseada em, para tornar proxy_redirect
mais simples):
location ~ ^/en/?((?<=/).*)?$ {
location = /en { return 302 /en/; }
proxy_pass http://127.0.0.1:8080/$1$is_args$args;
proxy_redirect http://127.0.0.1:8080/ /en/;
}
Portanto, se você me perguntar, a solução original com os dois locais de nível superior de irmãos ainda seria uma idéia melhor do que se cavar em uma toca de coelho, seguindo a rota regex.