Eu tenho um aplicativo da Web em execução no http://example.com/
, e quero "montar" outro aplicativo, em um servidor separado no http://example.com/en
. Servidores upstream e proxy_pass
parecem funcionar, mas por 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 upstream 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 permite reescrever o caminho passado para o upstream?
Esta é provavelmente a maneira mais eficiente de fazer o que você deseja, sem o uso de expressões regulares:
Eu gostaria de abordar uma resposta mais recente baseada em regex que vem crescendo em popularidade.
A solução pode parecer mais fofa à primeira vista, mas está errada por vários motivos.
O regex acima corresponderia a um uri de solicitação de
/enjoy
, redirecionando-o para/joy
upstream. Isso é realmente pretendido?Uma solicitação de
/en
não resultará em nenhum redirecionamento, servindo diretamente a/
partir do upstream (quase como se uma solicitação de/en/
fosse feita em vez disso, mas não exatamente). Se você usar URIs relativos dentro de sua página raiz upstream (caso contrário, por que você não teria o/en/
prefixo ali mesmo 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/style.css
em vez de/en/style.css
. (Ou mesmo se você usar URIs absolutos em todos os lugares, e se alguém fizer referência a um recurso semi-opcional obscuro relativamente?) Ops, de repente o site pode não funcionar, mas apenas às vezes ou em casos extremos.De acordo com meu conselho anterior em outra pergunta já mencionada pela própria resposta do OP , o uso de expressões regulares impede que a
proxy_redirect
diretiva tenha o valor padrão dedefault
, reduzindo-o paraoff
. Isso significa que, se o upstream responderLocation: http://127.0.0.1:8080/en/dir/
quando uma solicitação/en/dir
for feita, é isso que o cliente verá, o que obviamente não funcionará corretamente. (O que teria sido especialmente irônico para uma/en
solicitação que solicita o uso de regex em primeiro lugar, mas essa implementação específica sofre de 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 regulares dentroproxy_redirect
de , talvez até para corresponder a qualquer host, mas e se você decidir fornecer um redirecionamento entre domínios no futuro?Para tentar resolver 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 regex, para tornarproxy_redirect
mais simples):Então, se você me perguntar, a solução original com os dois locais irmãos de nível superior ainda seria uma ideia melhor do que se afundar em uma toca de coelho seguindo a rota regex.
Então, encontrei a resposta no stackoverflow :
Basicamente: passando um regex para o local e passando o backref para o URL proxy_pass.
Contabilidade para documentos Nginx
Para passar uma solicitação para um servidor proxy HTTP, a diretiva proxy_pass é especificada dentro de um local. Por exemplo:
Esta configuração de exemplo resulta na transmissão de todas as solicitações processadas neste local para o servidor 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 de solicitação que corresponde ao parâmetro de localização. 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 é passado (possivelmente modificado).
Eu brinquei com a solução aceita acima, mas descobri que estava causando redirecionamentos desonestos para todos os ativos CSS e JS. No final, encontrei inspiração na forma como as configurações do LinuxServer SWAG Nginx são feitas. Você pode encontrá-los aqui . Dê uma olhada
pihole.subfolder.conf.sample
.Dessa forma, minha solução fica assim: