No Nginx, tentamos redirecionar um URL da seguinte maneira:
http://example.com/some/path -> http://192.168.1.24
onde o usuário ainda vê o URL original no navegador. Depois que o usuário é redirecionado, digamos que ele clica no link /section/index.html
, gostaríamos de fazer uma solicitação que leve ao redirecionamento
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
e novamente preservar o URL original.
Nossas tentativas envolveram várias soluções usando proxies e regras de reescrita, e abaixo mostra a configuração que nos aproximou de uma solução (observe que esta é a configuração do servidor da example.com
web para o servidor da web). No entanto, ainda existem dois problemas com isso:
- Ele não executa a reescrita corretamente, na medida em que a URL de solicitação recebida pelo servidor da Web
http://192.168.1.24
inclui/some/path
e, portanto, falha ao veicular a página necessária. Quando você passa o mouse em um link depois que uma página é veiculada,
/some/path
falta o URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Estamos procurando uma solução que envolva apenas a alteração da configuração do servidor da web example.com
. Podemos alterar a configuração 192.168.1.24
(também Nginx), no entanto, queremos tentar evitar isso porque precisaremos repetir essa configuração para centenas de servidores diferentes cujo acesso é feito através de proxy example.com
.
root
dentro de umlocation
bloco, então você não terá nenhum comportamento inesperado nos locais padrão. Somente se você precisar alterar o padrãoroot
para cada local, poderá usá-lo.Você deve usar a parte URI na
proxy_pass
diretiva. Além disso, você misturou argumentos de ordem deproxy_redirect
diretiva e provavelmente não precisa disso. O Nginx possui um padrão razoável para esta diretiva.Nesse caso, seu
location
bloco pode ser realmente simples:fonte
/some/path/
parte da URL é preservada na solicitação que não é uma URL válida (precisamos reescrever a URL também para removê-la).Você pode usar a seguinte configuração para ter um mapeamento 100% contínuo entre
/some/path/
o front-end e/
o back-end.Observe que esta é a única resposta até o momento que também cuidaria perfeitamente de caminhos absolutos que geram
404 Not Found
erros, desde que oReferer
cabeçalho HTTP correto seja enviado pelo navegador. Portanto, todos esses gifs devem continuar carregando sem a necessidade de modificar o HTML subjacente (que não é apenas caro, mas também não é suportado sem módulos adicionais não compilados por padrão).Você pode encontrar a prova de conceito completa e o produto mínimo viável no repositório https://github.com/cnst/StackOverflow.cnst.nginx.conf .
Aqui está uma execução de teste para confirmar que todos os casos extremos parecem funcionar:
PS Se você tiver muitos caminhos diferentes para mapear, em vez de fazer uma comparação de regex de
$http_referer
dentro paraif
dentrolocation @404
, convém usar amap
diretiva baseada em global .Observe também que as barras finais
proxy_pass
, tanto quanto aslocation
que estão contidas, são muito importantes conforme uma resposta relacionada .Referências:
fonte
Quando essa barra é adicionada a um jenkins com proxy nginx, você recebe o erro "Parece que sua configuração de proxy reverso está com defeito".
Deve ler
fonte