No Nginx, tentamos redirecionar uma URL da seguinte forma:
http://example.com/some/path -> http://192.168.1.24
onde o usuário ainda vê o URL original em seu navegador. Depois que o usuário for redirecionado, digamos que ele clique no link para /section/index.html
, gostaríamos que isso fizesse uma solicitação que levasse ao redirecionamento
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
e novamente ainda preservar a 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 web para o example.com
servidor web). No entanto, ainda existem dois problemas com isso:
- Ele não executa a reescrita corretamente, pois a URL de solicitação recebida pelo servidor da Web
http://192.168.1.24
inclui/some/path
e, portanto, não atende à página necessária. Quando você passa o mouse em um link depois que uma página é veiculada,
/some/path
está faltando no 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 alterar a configuração do servidor web no example.com
. Podemos alterar a configuração 192.168.1.24
(também Nginx), mas queremos tentar evitar isso porque precisaremos repetir essa configuração para centenas de servidores diferentes cujo acesso é feito por proxy example.com
.
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. Nginx tem um padrão razoável para esta diretiva.Nesse caso, seu
location
bloco pode ser bem simples:Primeiro, você não deve usar
root
diretiva dentro do bloco de localização, é uma prática ruim. Neste caso, porém, não importa.Tente adicionar um segundo bloco de localização:
Isso captura a parte após /some/path/ e antes de index.html para uma variável $section, que é usada para definir o destino proxy_pass. Você pode tornar o regex mais específico se precisar.
Você pode usar a configuração a seguir para ter um mapeamento 100% perfeito entre
/some/path/
o front-end e/
o back-end.Observe que esta é a única resposta até agora que também cuidaria perfeitamente dos 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 sendo carregados 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á um teste para confirmar que todos os casos de borda parecem funcionar:
PS Se você tiver muitos caminhos diferentes para mapear, em vez de fazer uma comparação de regex
$http_referer
dentro de umif
dentro delocation @404
, convém usar amap
diretiva baseada em global.Observe também que as barras à direita no
proxy_pass
, bem como nolocation
que está contido, são bastante importantes de acordo com uma resposta relacionada .Referências:
Quando essa barra é adicionada a um jenkins com proxy nginx, você é apresentado com o erro "Parece que sua configuração de proxy reverso está quebrada".
Deve ler