Ich habe einen Upstream-Server, der das Login unserer Website verwaltet. Bei einer erfolgreichen Anmeldung möchte ich den Benutzer zum sicheren Teil der Site umleiten. Bei einem fehlgeschlagenen Login möchte ich den Benutzer zum Login-Formular umleiten.
Der Upstream-Server gibt 200 OK
bei einer erfolgreichen Anmeldung eine und 401 Unauthorized
bei einer fehlgeschlagenen Anmeldung eine zurück.
Dies ist der relevante Teil meiner Konfiguration:
{
error_page 401 = @error401
location @error401 {
return 302 /login.html # this page holds the login form
}
location = /login { # this is the POST target of the login form
proxy_pass http://localhost:8080;
proxy_intercept_errors on;
return 302 /secure/; # without this line, failures work. With it failed logins (401 upstream response) still get 302 redirected
}
}
Dieses Setup funktioniert, wenn die Anmeldung erfolgreich war. Der Client wird mit einem 302 umgeleitet. Dies funktioniert nicht , wenn die Anmeldung fehlschlägt. Der Upstream-Server gibt 401 zurück und ich habe erwartet, dass der error_page
dann einschaltet. Aber ich bekomme immer noch den 302. Wenn ich die return 302 /secure/
Zeile entferne, funktioniert die Umleitung zur Anmeldeseite. Es scheint also, dass ich eins haben kann, aber nicht beide.
Bonus-Frage; Ich bezweifle, dass die Art und Weise, wie ich error_page
mit dem genannten Ort umgehe, The Way ist. Habe ich recht damit?
edit : Es stellt sich heraus, dass ein return
im location
Block enthaltenes Nginx das überhaupt nicht verwendet proxy_pass
. Es ist also sinnvoll, dass die Fehlerseite nicht getroffen wird. Das Problem, wie dies zu tun ist, bleibt jedoch bestehen.
200 OK
scheint beim Erfolg der Anmeldung völlig vernünftig zu sein (dies ergibt einen Cookie) und 401 Unauthorized
scheint auch in Ordnung zu sein.