Kleines Problem mit header LOCATION
Ich möchte auf meiner Seite dafür sorgen, dass wenn man die index.php aufruft automatisch zur index.php?section=startpage weitergeleitet wird. Hier gibt es ein kleines Problem, da der HEADEr schon gesendet wurde...
Hallo,
Ich habe auf meiner Homepage in der index.php folgende Schleifen:
ELSE-Teil unten soll den folgenden Befehl enthalten:
Was ich bisher gemacht habe, ruf zwar dieselbe Seite auf, ich finde es aber doof wenn in der Adresszeile dann nur 'index.php' steht, und nicht 'index.php?section=startpage".
Was das problem ist, wei� ich schon: Oben in der Datei werden schon einige "ECHOS" gemacht, so ist die Header-Info nicht mehr änderbar, bzw. schon gesendet, bevor PHP "wei�", das diese eingentlich modifiziert werden soll.
Wie kann ich dieses Problemchen beheben?
GruÃ?
DeeDee0815
Hallo,
Ich habe auf meiner Homepage in der index.php folgende Schleifen:
if(isset($_GET['section'])) {
switch($_GET['section']) {
case "startpage":
include "sections/startpage.php";
break;
case "article":
include "sections/article.php";
break;
case "feature":
include "sections/feature.php";
break;
case "download":
include "sections/download.php";
break;
case "board":
include "sections/board.php";
break;
case "link":
include "sections/link.php";
break;
case "feedback":
include "sections/feedback.php";
break;
case "impress":
include "sections/impress.php";
break;
case "disclaimer":
include "sections/disclaimer.php";
break;
default:
include "sections/error.php";
break;
}
} else {
include "sections/startpage.php";
}
ELSE-Teil unten soll den folgenden Befehl enthalten:
header("LOCATION: index.php?section=startpage");
Was ich bisher gemacht habe, ruf zwar dieselbe Seite auf, ich finde es aber doof wenn in der Adresszeile dann nur 'index.php' steht, und nicht 'index.php?section=startpage".
Was das problem ist, wei� ich schon: Oben in der Datei werden schon einige "ECHOS" gemacht, so ist die Header-Info nicht mehr änderbar, bzw. schon gesendet, bevor PHP "wei�", das diese eingentlich modifiziert werden soll.
Wie kann ich dieses Problemchen beheben?
GruÃ?
DeeDee0815
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 24044
Url: https://administrator.de/forum/kleines-problem-mit-header-location-24044.html
Ausgedruckt am: 22.12.2024 um 13:12 Uhr
11 Kommentare
Neuester Kommentar
Hallo,
du kannst PHP anweisen, die erzeugten Daten nicht gleich zu senden, sondern erst am Ende des Skripts oder bei einem entsprechenden Befehl. Ergebnis: die Header werden noch nicht gesendet und du kannst sie noch modifizieren. Wie der Befehl heisst weiss ich aus dem Stehgreif auch nicht, aber du wirst ihn in der PHP-Doku sicherlich finden.
Aber ich würde mich gegen die Weiterleitung entscheiden, das braucht ja nur nochmal zusäztliche Zeit.
Filipp
du kannst PHP anweisen, die erzeugten Daten nicht gleich zu senden, sondern erst am Ende des Skripts oder bei einem entsprechenden Befehl. Ergebnis: die Header werden noch nicht gesendet und du kannst sie noch modifizieren. Wie der Befehl heisst weiss ich aus dem Stehgreif auch nicht, aber du wirst ihn in der PHP-Doku sicherlich finden.
Aber ich würde mich gegen die Weiterleitung entscheiden, das braucht ja nur nochmal zusäztliche Zeit.
Filipp
Hi,
also da gibt es den Weg über das Apache Addon mod rewrite.
Infos: www.modrewrite.de
dein .htaccess file müsste glaube ich etwa so aussehen:
RewriteEngine on
RewriteRule index.php$ index.php?section=startpage
Kleiner Tip für den Programmierstiel:
Mach es doch so, nicht über eine normale switch anweisung, sondern mach ein array mit den dateien als inhalt:
$section = array();
$section['startpage'] = 'sections/startpage.php';
$section['article'] = 'sections/article.php';
$section['feature'] = 'sections/feature.php';
und dann wo du momentan die switch anweisung hast machst du etwa folgendes:
if(isset($_GET['section']) AND isset($section[$_GET['section']]))
{
include $section[$_GET['section']];
}
else
{
include $section['startpage'];
}
Somit brauchst du nur noch für jede weitere Section die du machst einen Eintrag im Array erstellen und nicht mehr im code herumändern...
Ach, übrigens: das ist keine schleife, sondern eine Switch anweisung ;)
mfg, brc
also da gibt es den Weg über das Apache Addon mod rewrite.
Infos: www.modrewrite.de
dein .htaccess file müsste glaube ich etwa so aussehen:
RewriteEngine on
RewriteRule index.php$ index.php?section=startpage
Kleiner Tip für den Programmierstiel:
Mach es doch so, nicht über eine normale switch anweisung, sondern mach ein array mit den dateien als inhalt:
$section = array();
$section['startpage'] = 'sections/startpage.php';
$section['article'] = 'sections/article.php';
$section['feature'] = 'sections/feature.php';
und dann wo du momentan die switch anweisung hast machst du etwa folgendes:
if(isset($_GET['section']) AND isset($section[$_GET['section']]))
{
include $section[$_GET['section']];
}
else
{
include $section['startpage'];
}
Somit brauchst du nur noch für jede weitere Section die du machst einen Eintrag im Array erstellen und nicht mehr im code herumändern...
Ach, übrigens: das ist keine schleife, sondern eine Switch anweisung ;)
mfg, brc
Kopie aus der offiziellen PHP-Hilfe (nur die eckigen Klammern sind in wirklichkeit spitz):
Beachten Sie, dass header() aufgerufen werden muss, bevor eine Ausgabe gesendet wurde, egal ob normale HTML Tags, leere Zeilen in einer Datei oder von PHP. Ein weit verbreiteter Fehler ist mittels include(), require(), oder anderen Dateizugriffsmethoden Code zu lesen, und so unbewusst Leerzeichen oder Leerzeilen auszugeben, bevor header() aufgerufen wird. Das gleiche Problem besteht auch bei Verwendung einer einzigen PHP/HTML Datei.
[html]
[?php]
Dies funktioniert nicht. Beachten Sie die
obige Ausgabe noch vor dem header()-Aufruf
header('Location: http://www.example.com/');
?]
Anmerkung: In PHP 4 können Sie dieses Problem umgehen, indem Sie Output Buffering benutzen (mit dem Overhead, dass alle Ihre Ausgaben an den Browser gepuffert werden, bis Sie diese Senden). Um dies zu tun, verwenden Sie in Ihrem Skript ob_start() und ob_end_flush(), oder setzten die Konfigurationsdirektive output_buffering in der php.ini bzw. in den Server Konfigurationsdateien.
Hast du ob_start() mal ausprobiert?
Filipp
Beachten Sie, dass header() aufgerufen werden muss, bevor eine Ausgabe gesendet wurde, egal ob normale HTML Tags, leere Zeilen in einer Datei oder von PHP. Ein weit verbreiteter Fehler ist mittels include(), require(), oder anderen Dateizugriffsmethoden Code zu lesen, und so unbewusst Leerzeichen oder Leerzeilen auszugeben, bevor header() aufgerufen wird. Das gleiche Problem besteht auch bei Verwendung einer einzigen PHP/HTML Datei.
[html]
[?php]
Dies funktioniert nicht. Beachten Sie die
obige Ausgabe noch vor dem header()-Aufruf
header('Location: http://www.example.com/');
?]
Anmerkung: In PHP 4 können Sie dieses Problem umgehen, indem Sie Output Buffering benutzen (mit dem Overhead, dass alle Ihre Ausgaben an den Browser gepuffert werden, bis Sie diese Senden). Um dies zu tun, verwenden Sie in Ihrem Skript ob_start() und ob_end_flush(), oder setzten die Konfigurationsdirektive output_buffering in der php.ini bzw. in den Server Konfigurationsdateien.
Hast du ob_start() mal ausprobiert?
Filipp