Mailinglisten-Archive |
Hallo zusammen,
ich hab hier eine "kleine" Funktion die sicher auch für andere interessant
sein dürfte.
Oft benötigt man die Funktionsweise eines redirect mittels header("Location:
$path")
Da dies gerade auch bei Sessions zu Problemen führen kann und da man für
diesen Redirect auch stets eine vollständige URL angeben sollte (siehe
vergangene postings zu dem Thema) soll diese Funktion das etwas
vereinfachen:
function redirect($url) {
// Ziel-URL auseinandernehmen
$url_parts = parse_url($url);
// Kein Protokoll? Dann "http" als Protokoll
if (!$url_parts["scheme"]) { $url_parts["scheme"]="http"; }
// Kein Host? Dann den aktuellen Host einsetzen
if (!$url_parts["host"]) { $url_parts["host"]=$GLOBALS["HTTP_HOST"]; }
// Der Pfad beginnt nicht mit einem /? -> rel. Pfad zu absolutem Pfad
machen.
// ToDo: "/x/../y.php" muss nocht vereinfacht werden
if ($url_parts["path"]) {
if (substr($url_parts["path"],0,1)!="/") {
$s=$GLOBALS["SCRIPT_NAME"];
$url_parts["path"]=substr($s,0,strrpos($s,"/")+1).$url_parts["path"];
}
}
// evtl. Session anhängen
$SID=session_id();
if (($SID) &&
(!strcasecmp($url_parts["host"],$GLOBALS["HTTP_HOST"])) &&
(!ini_get("session.use_cookies"))) {
$s=$url_parts["query"];
$url_parts["query"]=$s.(($s)?"&":"").session_name()."=$SID";
}
// neue URL zusammenbauen
$url=$url_parts["scheme"]."://";
if (($url_parts["user"]) || ($url_parts["pass"])) {
$url.=$url_parts["user"].":".$url_parts["pass"]."_(at)_";
}
$url.=$url_parts["host"];
if ($url_parts["port"]) {
$url.=":".$url_parts["port"];
}
$url.=$url_parts["path"];
if ($url_parts["query"]) {
$url.="?".$url_parts["query"];
}
if ($url_parts["fragment"]) {
$url.="#".$url_parts["fragment"];
}
// Redirect ausführen
header("Location: ".$url);
exit;
}
Irgendjemand Anmerkungen, Ideen oder weitere Vorschläge ? Insbesondere für
das ToDo mit dem Pfad.
Gruß,
Andreas
php::bar PHP Wiki - Listenarchive