nginx cortando parte do caminho durante o redirecionamento proxy_pass

nginx cortando parte do caminho durante o redirecionamento proxy_pass

Estou configurando um proxy reverso que recebe solicitações de um servidor de autenticação federado e as encaminha para meu aplicativo back-end. Quando falta uma barra final nas solicitações, o nginx faz seu redirecionamento 301 padrão, mas o endereço para o qual ele redireciona não inclui o caminho correspondente no bloco de localização. A ideia é fazer proxy das solicitações upstream.com/myApppara o URL raiz backend.com/no Gunicorn. Minha configuração é:

geo $allow {
    default 0;
    <upstream ip> 1;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    set_real_ip_from <backend ip>;
    real_ip_header X-Forwarded-For;

    if ($allow = 0) {
        return 444;
    }

    server_name backend.com;
    underscores_in_headers on;

    include snippets/<ssl-conf>;
    include snippets/<ssl-params>;

    location /<myApp>/static/ {
        root /<path>/<myApp>/static;
    }

    location /<myApp>/ {

        include proxy_params;
        proxy_pass_request_headers on;
        proxy_pass http://unix:/<path>/<myApp>/<myApp>.sock:/;
    }

    location = /<myApp> {

        include proxy_params;
        proxy_pass_request_headers on;
        proxy_pass 
        http://unix:/<path>/<myApp>/<myApp>.sock:/;
    }

}

Originalmente, eu tinha incluído apenas o primeiro bloco de localização, mas quando uma solicitação from upstream.com/myApp(sem uma barra final) acontecia, o nginx redirecionava para backend.com/myApp/e não encaminhava os cabeçalhos da solicitação original. Adicionar o segundo bloco de localização para evitar o redirecionamento corrigiu isso.

Agora, no entanto, se eu receber uma solicitação como upstream.com/myApp/search(novamente, sem barra final), ele faz um redirecionamento 301 para upstream.com/search/(adiciona a barra final, mas a parte desaparece. Como posso preservar a parte no URL depois que o nginx faz o redirecionamento ?

Responder1

Fiz mais algumas depurações e isso acabou não sendo um problema do Nginx. Em vez disso, é um problema do Django não anexar o caminho filtrado pelo proxy nginx aos redirecionamentos.

Responder2

Não é um problema do Nginx, é um recurso do Nginx. Se você não deseja que o Nginx remova a parte do caminho que corresponde ao seu bloco de localização, sua diretiva proxy_pass não deve ter um caminho especificado após server:port ou socket.

Isso inclui apenas uma barra final no final, qualquer caminho que você especificar substituirá a parte correspondente do seu bloco de localização, e se você apenas especificar uma barra, isso terá o efeito de excluir a parte correspondente

informação relacionada