Edgar Ehritt: interne HTTP-Handhabung

Beitrag lesen

Hallo Rolf,

Schau dir mal die HTTP-Header an, die das Script ausgibt.

php 5.3.0 per shell im Test:

$ echo "<?php header('Refresh: 1;url=bla'); ?>" | php-cgi

Status: 200 OK
Refresh: 1;url=bla
Content-type: text/html; charsetz=iso-8859-1

header(refresh:...) ist ein Wrapper für header(location:...)

Dazu liegen mir (insbesondere nach meinem Test) keine Anhaltspunkte vor.

und das Umleiten funktioniert nur, wenn vorher der HTTP-Header nicht abgechlossen wurde,

Bis dahin gehe ich noch als allgemein gültige Aussage mit.

was bei Dir offensichtlich der Fall ist,

Soweit ist das mindesten nicht offensichtlich. Einzige Möglichkeit wäre nur, das gd.so/gd.dll nicht eingebunden wurde, was _eben nicht offensichtlich_ dem Code zu entnehmen ist.

weil der Content-Type vorher schon ausgegeben wurde.

Lassen wir die Statuszeile als Sonderfall außen vor, gibt es laut HTTP-Spezifikation keine Reihenfolge für Header. (Auch auf PHP-Ebene gibt es diese nicht. Hier lassen sich gleichlautende HTTP-Header sogar überschreiben. Dazu hat die Funktion header() seit Version 4.0.4 den zweiten, optionalen Parameter. Intern werde also alle Header so lange durch PHP selbst gesammelt und können überschrieben werden, bis deren Aussenden an den Webserver zwangsläufig wird, weil die erste inhaltliche Ausgabe der zu servierenden Ressource dem Webserver übergeben werden soll.)

Gruß aus Berlin!
eddi