nginx proxy_pass dinâmico com variável entre redirecionamentos

1

O proxy_pass do Nginx com variáveis é difícil de entender. Alguém pode explicar como eu conseguiria o cenário abaixo?

#first call /?proxytohost=http://blahblah.com
#second redirection to /
#third call /home 

location / {
    if ($arg_proxytohost) {
        set $proxytohost $arg_proxytohost;
        rewrite ^.*$ / break;
    }

    proxy_pass https://$proxytohost;   #first call it may recognize, third call definitely it cant

    proxy_intercept_errors on;
    error_page 301 302 307 = @handle_redirects;
}

location @handle_redirects {
    set $saved_redirect_location '$upstream_http_location';
    proxy_set_header  Host $proxy_host;
    proxy_pass $proxytohost$saved_redirect_location;   #this has proxytohost, i dont think it can recognize the variable here
}

EDITAR:

Queria inverter o proxy em algumas instâncias que são dinâmicas (a.blahblah.com, b.blahblah.com, etc.). Cada uma dessas instâncias de serviço tem vários redirecionamentos onde eu preciso armazenar cookies e redirecioná-los (é por isso que eu tenho a seção @handle_redirects).

Se eu definir a variável $proxytohost acima da declaração de local como a.blahblah.com, ela está funcionando como esperado.

Mas se eu quiser enviar esse $proxytohost como um argumento dinâmico para o primeiro pedido e, em seguida, configurá-lo para uma variável e, em seguida, proxy_pass, ele não funciona.

Por exemplo, se assumirmos que meu nginx está sendo executado em localhost:8080 , isso é o que minha expectativa é

Se eu enrolar abaixo

http://localhost:8080/?proxytohost=a.blahblah.com?authToken=aksdfkj

ele deve me levar a uma página inicial depois de usar esse token para autenticação e redirecionamento para a página inicial,

http://localhost:8080/home

neste caso, /home é um conteúdo que é veiculado em https://a.blahblah.com/home .

    
por raksja 24.01.2018 / 20:22

2 respostas

2

Isso não funcionará.

Se eu entendi corretamente, você deseja fazer proxy para o mesmo host em solicitações sucessivas. O Nginx manipula solicitações independentes umas das outras. Então, na segunda e na terceira solicitação, se $arg_proxytohost estiver ausente e o padrão fornecido for usado.

Sugiro usar cookies para isso. Um pequeno exemplo abaixo.

Isso precisa estar no http {} poderia estar em conf.d em um arquivo separado

map $cookie_p_host $p_host {
    default $cookie_p_host;
    ""      $host;
}

Em seguida, temos os locais que entram no servidor {}

location ~ /proxy/sethost/(?<p_host>.*) { 
    add_header Set-Cookie 'p_host=$p_host;path=/proxy'; 
    add_header Content-type text/html; 
    return 200 'cookie was "$cookie_p_host"<br>now set to "$p_host"'; 
}

location   ~ /proxy(?<p_uri>.*) { 
    resolver         8.8.8.8 ; 
    resolver_timeout 5s; 
    proxy_set_header Host $p_host; 
    proxy_pass       http://$p_host$p_uri; 
}

uso / explicação:

mapeamento

O mapeamento é usado para evitar declarações desagradáveis. Se o cookie é definido, ele é usado como o nome do host (correto ou não, nós não verificamos ou nos importamos). Se não estiver definido (null / empty), usamos a variável $ host. Pode mudar isso para qualquer coisa que você quiser lá.

primeiro local

( link ) irá definir um cookie com o host definido para example.com. Qualquer coisa depois de / proxy / sethost / contará como o nome do host!

segunda localização

( link ) agora será procurado em example.com. Adicionado um resolvedor para pesquisas dinâmicas se ainda não estiver em algum outro lugar na configuração. Precisamos definir o cabeçalho do host da solicitação de proxy para o solicitado e vamos lá.

Espero que isso ajude. O voodoo de redirecionamento é outro tópico

    
por 25.01.2018 / 14:48
0

Você pode alterar a diretiva if para fora do bloco de localização e terá o mesmo significado.

if ($arg_proxytohost) {
    set $proxytohost $arg_proxytohost;
    rewrite ^.*$ / break;
}
location / {
proxy_pass https://$proxytohost;   #first call it may recognize, third call definitely it cant

proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirects;

}

    
por 25.01.2018 / 11:31