Hi,
wenn er das macht, *existiert* *keine* *Authentication* *mehr*! Diese findet ausschließlich auf dem Originalserver statt, welcher immer(!) dann, wenn sich der User authentifizieren soll, das ErrorDocument 401 zum Client sendet. Wenn dies ein Redirect auf einen Fremdserver ist, dann ist das ein Redirect und *keine* Authentication mehr.
Wieso nicht? Die ersetzte 401-Seite wird doch erst 'angezeigt', wenn wenigstens einmal die Authentifizierung fehlgeschlagen ist.
die erste fehlgeschlagene Authetifizierung ist der Versuch, die Ressource _ohne_ Authentifizierung anzufordern.
Der Server schickt den 401 als Antwort auf eine normale Anfrage. Der Client muss jetzt mit einem Auth-Header antworten und kann dabei die Request wiederholen. Wird erneut mit 401 geantwortet, waren die Auth-Daten ungültig. Nach meinem Verständnis wird doch frühestens jetzt die 401er-Entity angezeigt,
Was der Browser Dir in seinem Fenster anzeigt, ist für HTTP völlig unerheblich. Der Client schickt eine Anfrage an den Server; dieser stellt fest, dass sich der Client bitteschön zu authentifizieren hat und sendet einen 401; der Client kann daraufhin entweder aufgeben oder den User um entsprechende Daten bitten; im zweiten Fall beginnt der Vorgang erneut. HTTP kennt kein "erstes Mal", sondern nur das "jetzt", welches immer gleich funktioniert. Das bedeutet auch:
Schickt der Server dem Client eine Fehlerseite von einem anderen Server zurück, so lautet der Status 3xx, und von einem 401 erfährt der Client gar nichts mehr. Es *gibt* dann keine Authentication mehr, denn sie *kann* nicht mit einer Fehlerseite eines fremden Servers funktionieren. No way.
Wenn aber die Daten richtig waren, landet der Client doch auf der geschützten Seite.
Der Client erfährt gar nicht erst, dass es solche Daten zu versenden gibt.
Wenn ein ErrorDocument 401 LokaleURI so funktionieren würde, wie Du fragst, würde sofort die entsprechende Fehlermeldung angezeigt und der Client wäre gezwungen, die Request mit Auth-Header zu wiederholen.
Der Client gibt statt der Fehlerseite einfach eine Login-Box aus. Das ist aber _seine_ Entscheidung.
Dass ein direkter Redirect nicht geht, ist mir klar, dann würde der Client den 401 nicht zu sehen bekommen. Aber wenn der Client einen 401 bekommt, falsch beantwortet und als Reaktion statt eines 401 mit Informationen einen 303 oder 302 bekommt, sollte das doch kein Problem sein?
Dazu muss der 401 aber lokal sein. HTTP besteht _nur_ aus Request und Response, nicht aus Request und Response mit der Option eines weiteren Request. Dazu müsste HTTP verbindungsbehaftet sein, und das ist es nicht.
Wieso sollte dann bei fehlerhafter Auth ein 403 kommen?
Weil Torwächter eine Fehlerseite bei einem anderen Server haben möchte. Das impliziert, dass der Zugriff verwehrt wurde, also 403.
Klar, aber das macht nicht der Server,
Ein 403 kommt vom Server. Es ist der Status eines Response-Headers.
sondern dafür müsste er sorgen, zur Not mit einem serverinternen Redirect auf ein deny all- Verzeichnis.
Diesen Teil verstehe ich nicht.
Steh ich grade auf dem Schlauch?
Ich glaube, es fehlt wirklich nur der "klick"-Effekt :-)
Die Tatsache, dass die Apache-Entwickler in der ErrorDocument-Doku in Fettdruck geschrieben haben, dass absolute URIs bei 401 nicht erlaubt sind, hat nichts damit zu tun, dass die Leute nicht programmieren können. Es ergibt sich einfach aus der technischen Notwendigkeit, aus der Funktionsweise von HTTP. Ein 'ErrorDocument 401 http://...' *geht einfach nicht*, es ergibt keinen Sinn. Es würde notwendigerweise dazu führen, dass *jeder* 401 mit einem 403 identisch ist, das also der Zugang zu einem authentifizierten Bereich bereits verwehrt wird, bevor der Client überhaupt davon erfährt, dass er sich authentifizieren soll.
Cheatah