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/myApp
para 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