NGINX – Redirecionar solicitação para outro IP, mantendo URL

NGINX – Redirecionar solicitação para outro IP, mantendo URL

Tenho DNS dinâmico configurado e quero poder acessar diferentes computadores de fora da minha casa. Atualmente tenho um raspberry pi rodando nginx em 192.168.1.2, com meu roteador em 192.168.1.1. Eu também tenho a porta 80 encaminhada do roteador para o raspberry pi, então simplesmente clicar no URL DNS dinâmico mostra a página phpinfo() na minha página inicial do pi.

Em seguida, quero poder mydns.com/device1manter esse URL enquanto redireciono internamente para o outro dispositivo.

Ou seja, verei http://mydns.com/device1, mas terei acesso http://192.168.1.3internamente. Além disso, se eu digitar, mydns.com/device1/loginele será redirecionado internamente para http://192.168.1.3/login.

Estou tentando usar sub_filterassim:

sub_filter_once off;
sub_filter_types text/html;
sub_filter ""http://192.168.1.3" "http://192.168.1.2"
proxy_pass http://192.168.1.3/;
proxy_set_header Host $host;

Isso está funcionando até certo ponto, mas não totalmente. Os caminhos não estão redirecionando, por exemplo, arquivos em subpastas. Por exemplo:

Eu quero isso: http://mydns.com/device1/style/basic.css

Mas veja só: http://mydns.com/style/basic.css

Isso causa um erro 404, como pode ser visto na visualização do Console no Chrome. Eu recebo este erro:

Failed to load resource: the server responded with a status of 404 (Not Found)

Isso está no caminho: http://mydns.com/style/basic.cssmas eu preciso http://mydns.com/device1/style/basic.css.

Posso acessar o arquivo CSS na barra de endereço digitando http://mydns.com/device1/style/basic.css. então eu sei que é acessível, simplesmente não consigo fazer com que o NGINX encaminhe/reescreva essas pastas.

Alguém pode ajudar? Obrigado

Responder1

Pode ter vários motivos:

  • algo reescreve seu URI antes de entrar no local com proxy_pass;
  • ou é fornecido como sub-URI correspondente em alguns locais processados ​​anteriormente;
  • ou (na sua versão nginx) a barra /após IP na diretiva proxy_pass faz com que o nginx pegue a barra como um URI de proxy e a reescreva antes de enviar.

Não se pode ver exatamente o que acontece do seu lado sem ver toda a sua configuração. Ou você pode tentar ativar o log de depuração (para ver o que causa isso).

De qualquer forma, relacionado aos motivos mencionados acima, você tem três maneiras de resolver isso:

  • você evitaria reescrever ou teria que adicionar mais rewrite ... breakantes de proxy_pass para estender o URI;
  • ou você pode tentar defini-lo como proxy_pass http://192.168.1.3/device1/;ou com alguma variável (mapeamento) semelhante proxy_pass http://192.168.1.3/$device/;ou até mesmo com URI originado completo como proxy_pass http://192.168.1.3$request_uri;(observe que não há /aqui).
  • ou você pode tentar remover a barra final, então proxy_pass http://192.168.1.3;(sem barra) em vez de proxy_pass http://192.168.1.3**/**;(com barra).
    Neste caso "o URI da solicitação é passado para o servidor na mesma forma que foi enviado por um cliente quando a solicitação original é processada" (se nenhuma reescrita ocorre) ou "o URI de solicitação normalizado completo é passado ao processar o URI alterado" (se algumas reescritas acontecerem ou se você tiver alguns locais provisórios com alias e try_files ... @proxypassados).

Dê uma olhadaproxy_passdocumentação para todas as variantes possíveis de uso do proxy_pass.

informação relacionada