Sönke Tesch: Variablen leeren

Beitrag lesen

Der Server schickt gar nichts, solange das der Interpreter bzw. das Skript nicht sagt, daß er etwas schicken soll.

Heißt das also, dass das Script erst mit seinem ersten Schreibvorgang auf stdout den Server zum z.B. 200 veranlasst?

Nein, im Falle von CGI dürfte der Server erst einen Antwortcode senden, wenn die Kopfdaten vom Skript durch sind (d.h. sobald die erste Leerzeile nach stdout geschrieben wird). Anders kann er nicht reagieren, wenn das Skript ungültige Kopfdaten ausgibt (der berühmte 500er). Und möglicherweise möchte das Skript ja auch selbst den Antwortcode bestimmen, was natürlich nicht geht, wenn der Server die Antwort schon eigenmächtig geliefert hat.

Wenn es um ein Modul geht, sieht die Sache sowieso etwas anders aus, da der Interpreter dann direkt in die serverinterne HTTP-Verarbeitung eingebunden ist, auf serverinterne Ausgabe- und Verwaltungsfunktionen zugreifen kann und dementsprechend "stdout" keinerlei Bedeutung hat. Die Kopfzeilen werden beispielsweise beim Apache nicht einfach ausgegeben, sondern in eine Liste eingefügt, die dann auf Befehl gesendet wird.
Details zu den Interna finden sich im Kapitel "Apache API" der Anleitung.

Und wenn ich im Script einen Header produziert habe, wird der stattdessen gesandt? Wird denn alles überschreiben oder nur die Angaben, die im Script neu gesetzt wurden?

Das hängt von der Verarbeitung sowohl im Modul (z.B. CGI oder PHP) ab. Grundsätzlich kann alles passieren, die Kopfdaten werden im Apache (1) wie gesagt in einer separaten Liste geführt und erst auf Befehl gesendet. Was genau CGI- und PHP-Modul veranstalten, weiß ich nicht, da ich im Moment den Code nicht hier habe.

Umleitungen sind nervig, das sehe ich auch so. Allerdings merkt der Client in der Regel ja gar nichts davon, wenn die erste Antwort prompt kommt. Die paar Byte Header machen da dann auch nichts mehr aus. Die ganze Seite muss ich ja nicht mitschicken.

Womit Du allerdings recht hast.

Gibt es eigentlich Browser, die diese 302er nicht unterstützen?

Unwahrscheinlich. In RFC 2616 (HTTP 1.1) steht jedenfalls nur bei 303 der Hinweis, daß manche Clients (genauer gesagt alles vor 1.1) diesen Code (303) nicht kennen. 302 gehörte demnach wohl schon zu HTTP 1.0 und dessen Festlegung ist schon Jahre her (1.1 ist von '99).

Gruß,
  soenk.e