Eu tenho um aplicativo da Web em execução http://example.com/
e quero "montar" outro aplicativo, em um servidor separado http://example.com/en
. Servidores upstream e proxy_pass
parecem funcionar, mas com um problema:
upstream luscious {
server lixxxx.members.linode.com:9001;
}
server {
root /var/www/example.com/current/public/;
server_name example.com;
location /en {
proxy_pass http://luscious;
}
}
Ao abrir example.com/en
, meu aplicativo upstream retorna 404 not found /en
. Isso faz sentido, pois o rio acima não tem o caminho /en
.
É proxy_path
a solução certa? Devo reescrever "upstream" para que ele ouça /en
, como caminho raiz? Ou existe uma diretiva que me permita reescrever o caminho passado para o upstream?
proxy_pass
é o que faz a diferença. Além disso, essa resposta é mais correta do que a que você encontrou, porque também garante queproxy_redirect
permaneça emdefault
, portanto, você ainda pode usar302
et al em seu back-end e fazê-lo funcionar corretamente em qualquer lugar.Gostaria de abordar uma resposta mais recente baseada em regex que está crescendo em popularidade.
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 exemplosrc="style.css"
(que pode fazer referência a um idioma específicourl("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 dedefault
, diminuindo-ooff
. Isso significa que, se o upstream responderLocation: 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 separadoproxy_redirect
para cada um deles? Você também pode usar expressões regularesproxy_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 umaupstream
diretiva baseada em, para tornarproxy_redirect
mais simples):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.
fonte
nginx: [emerg] location "/en" is outside location "^/en/?((?<=/).*
Então, eu encontrei a resposta no stackoverflow :
Basicamente: passando um regex para o local e passando o backref para o URL proxy_pass.
fonte
Contabilidade para documentos Nginx
Para passar uma solicitação para um servidor com proxy HTTP, a diretiva proxy_pass é especificada dentro de um local. Por exemplo:
Esta configuração de exemplo resulta na transmissão de todos os pedidos processados neste local para o servidor em proxy no endereço especificado. Este endereço pode ser especificado como um nome de domínio ou um endereço IP. O endereço também pode incluir uma porta:
Observe que no primeiro exemplo acima, o endereço do servidor proxy é seguido por um URI, / link /. Se o URI for especificado junto com o endereço, ele substituirá a parte do URI da solicitação que corresponde ao parâmetro location. Por exemplo, aqui a solicitação com o /some/path/page.html URI será enviada por proxy para http://www.example.com/link/page.html . Se o endereço for especificado sem um URI ou não for possível determinar a parte do URI a ser substituída, o URI de solicitação completo será passado (possivelmente modificado).
fonte