Rolf B: php header:location

Beitrag lesen

Hallo dedlfix,

der Redirect wird nicht vom Server ausgeführt, sondern der Browser reagiert auf den Response-Header. Und er ruft, bei einer relativen URL, die neue Adresse relativ zu der Adresse aus dem Request ab.

Wenn also foo.php und bar.php im gleichen Ordner stehen, sollte eine Response aus foo.php mit Header Location: bar.php die gewünschte Umleitung erzielen (Location, nicht location, das hatte ich oben falsch geschrieben, sorry).

Um das zu debuggen, würde ich im Netzwerk-Tab des Browsers beginnen. Welche Requeste führt der Browser durch, welche Header sind in der Response des ersten Requests?

Übrigens, Pit, wenn Du schon die URL verabsolutieren willst, dann ist $_SERVER['SERVER_NAME'] das falsche Präfix. Richtig ist

$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'].'/path/to/app/foo.php';

Das Protokoll wird über die $_SERVER Variable HTTPS ermittelt, die für HTTP leer ist. Bzw. beim IIS den Wert "off" enthält (argh!). Der Wert, der bei HTTPS drin steht, ist undefiniert, darum die krumme Abfrage.

Das // vorneweg sagt, dass die URL mit einem Hostnamen beginnt. HTTP_HOST enthält auch den Port, falls Du die Seite nicht über Port 80 aufgerufen hast. Und zwischen Hostname und Pfad muss ein / stehen, das ist in der HTTP_HOST Variablen nicht drin.

Aber wie gesagt, das ist unnütze Akrobatik. Man kann protokollfreie URLs verwenden (//example.org/path/foo.php) und auch hostfreie URLs (/path/foo.php). Das Problem dürfte anderswo liegen.

Rolf

--
sumpsi - posui - clusi