Nginx schneidet während der Proxy-Pass-Umleitung einen Teil des Pfads ab

Nginx schneidet während der Proxy-Pass-Umleitung einen Teil des Pfads ab

Ich richte einen Reverseproxy ein, der Anfragen von einem föderierten Authentifizierungsserver empfängt und an meine Backend-App weiterleitet. Wenn den Anfragen ein abschließender Schrägstrich fehlt, führt nginx seine standardmäßige 301-Umleitung durch, aber die Adresse, zu der es umleitet, enthält nicht den im Standortblock übereinstimmenden Pfad. Die Idee besteht darin, Anfragen von upstream.com/myAppan die Stamm-URL backend.com/in Gunicorn weiterzuleiten. Meine Konfiguration ist:

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:/;
    }

}

Ursprünglich hatte ich nur den ersten Standortblock eingefügt, aber wenn eine Anfrage von upstream.com/myApp(ohne abschließenden Schrägstrich) erfolgte, leitete nginx zu um backend.com/myApp/und leitete die Header der ursprünglichen Anfrage nicht weiter. Das Hinzufügen des zweiten Standortblocks, um die Umleitung zu verhindern, hat das Problem behoben.

Wenn ich jetzt jedoch eine Anfrage wie diese erhalte upstream.com/myApp/search(wiederum ohne abschließenden Schrägstrich), erfolgt eine 301-Umleitung zu upstream.com/search/(der abschließende Schrägstrich wird hinzugefügt, aber der Teil ist weg. Wie kann ich den Teil in der URL beibehalten, nachdem Nginx die Umleitung durchgeführt hat?

Antwort1

Ich habe noch ein bisschen nachgetestet und es stellte sich heraus, dass es sich nicht um ein Nginx-Problem handelte. Es liegt eher daran, dass Django den vom Nginx-Proxy herausgefilterten Pfad nicht an Weiterleitungen anhängt.

Antwort2

Es handelt sich nicht um ein Nginx-Problem, sondern um eine Nginx-Funktion. Wenn Sie nicht möchten, dass Nginx den Teil des Pfads entfernt, der mit Ihrem Standortblock übereinstimmt, darf Ihre Proxy_Pass-Direktive nach dem Server:Port oder Socket keinen Pfad angeben.

Dazu gehört nur ein abschließender Schrägstrich am Ende. Jeder von Ihnen angegebene Pfad ersetzt den übereinstimmenden Teil Ihres Standortblocks. Wenn Sie nur einen Schrägstrich angeben, wird der übereinstimmende Teil gelöscht.

verwandte Informationen