nginx corta parte de la ruta durante la redirección proxy_pass

nginx corta parte de la ruta durante la redirección proxy_pass

Estoy configurando un proxy inverso que recibe solicitudes de un servidor de autenticación federado y las reenvía a mi aplicación de backend. Cuando a las solicitudes les falta una barra diagonal, nginx realiza su redirección 301 predeterminada, pero la dirección a la que redirige no incluye la ruta coincidente en el bloque de ubicación. La idea es enviar solicitudes desde upstream.com/myAppla URL raíz backend.com/en Gunicorn. Mi configuración es:

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 solo había incluido el primer bloque de ubicación, pero cuando upstream.com/myAppocurría una solicitud de (sin una barra diagonal), nginx redirigiría a backend.com/myApp/y no reenviaría los encabezados de la solicitud original. Agregar el segundo bloque de ubicación para evitar la redirección solucionó ese problema.

Ahora, sin embargo, si recibo una solicitud como upstream.com/myApp/search(nuevamente, sin barra diagonal), realiza una redirección 301 a upstream.com/search/(agrega la barra diagonal, pero la parte desaparece. ¿Cómo puedo conservar la parte en la URL después de que nginx realice la redirección? ?

Respuesta1

Hice un poco más de depuración y al final esto no fue un problema de Nginx. Más bien, es un problema que Django no agrega la ruta filtrada por el proxy nginx a las redirecciones.

Respuesta2

No es un problema de Nginx, es una característica de Nginx. Si no desea que Nginx elimine la parte de la ruta que coincide con su bloque de ubicación, entonces su directiva proxy_pass no debe tener una ruta especificada después del servidor: puerto o socket.

Esto incluye solo una barra diagonal al final, cualquier ruta que especifique reemplazará la parte coincidente de su bloque de ubicación, y si solo especifica una barra diagonal, tendrá el efecto de eliminar la parte coincidente.

información relacionada