37xo: PHP Problem mit Weiterleitung

Hi! Ich habe seit 2-3 Tagen mit dem Problem zu kämpfen, dass bei meinem Logout-Script die Weiterleitung nicht funktioniert. Nachdem Logout soll erscheinen "Herzlich Willkommen, Username". Danach soll man zur Startseite umgeleitet werden. Das mit dem einloggen funktioniert, aber anstatt umgeleitet zu werden, erhält man diese Fehlermeldung:

Warning: Cannot modify header information - headers already sent by (output started at /users/xxxxx/www/res/logout.php:5) in /users/xxxxx/www/res/logout.php on line 6.

Hier der Code:

<?php
session_start();
session_destroy();

echo 'You were successfully logged out!';
header ("Location: index.php");
?>
  1. Hallo 37xo,

    header kannst du nur senden, wenn noch keine Ausgabe erfolgt ist.

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
  2. Moin,

    Warning: Cannot modify header information - headers already sent by (output started at /users/xxxxx/www/res/logout.php:5) in /users/xxxxx/www/res/logout.php on line 6.

    <?php
    session_start();
    session_destroy();
    
    echo 'You were successfully logged out!';
    header ("Location: index.php");
    ?>
    

    das ist schon fast ein Klassiker, und vermutlich hättest du die Lösung selbst schon gefunden, wenn du mal nach dem Wortlaut der Fehlermeldung gegoogelt hättest.

    Was besagt denn die Meldung? In Zeile 6 können keine Header-Informationen mehr generiert werden, weil schon in Zeile 5 die erste Ausgabe stattfand. Die Lösung sieht in deinem Fall trivial aus: Tausche einfach die Zeilen 5 und 6. Dann wird erst der HTTP-Header angelegt, und dann folgt erst die Ausgabe von Nutzinhalt - und die Welt ist wieder in Ordnung.

    Übrigens verlangt die HTTP-Spezifikation, dass der Location-Header eine vollständige, absolute URL enthält. Die meisten Clients scheinen wohl auch relative URLs zu akzeptieren, aber in Ordnung ist das nicht.

    So long,
     Martin

    --
    Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
    - Douglas Adams, The Hitchhiker's Guide To The Galaxy
    1. Hallo

      das ist schon fast ein Klassiker, und vermutlich hättest du die Lösung selbst schon gefunden, wenn du mal nach dem Wortlaut der Fehlermeldung gegoogelt hättest.

      Was besagt denn die Meldung? In Zeile 6 können keine Header-Informationen mehr generiert werden, weil schon in Zeile 5 die erste Ausgabe stattfand. Die Lösung sieht in deinem Fall trivial aus: Tausche einfach die Zeilen 5 und 6.

      Nein, er soll die Zeile 5 weg lassen.

      Dann wird erst der HTTP-Header angelegt, und dann folgt erst die Ausgabe von Nutzinhalt - und die Welt ist wieder in Ordnung.

      Wie wird die Ausgabe aussehen, wenn schon vorher die Weiterleitung woandershin ausgelöst wurde?

      Übrigens verlangt die HTTP-Spezifikation, dass der Location-Header eine vollständige, absolute URL enthält. Die meisten Clients scheinen wohl auch relative URLs zu akzeptieren, aber in Ordnung ist das nicht.

      Das stimmt, wie mir selbst nach einer gleichlautenden Warnung gesagt wurde, nicht mehr. Der Standard wurde an das fehlertolerante Verhalten der Browser angepasst, Relative Adressen sind mittlerweile erlaubt und werden, wie relative Links auch, vom Browser zu absoluten Adressen ergänzt.

      Tschö, Auge

      --
      Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
      Wolfgang Schneidewind *prust*
      1. Tach!

        Wie wird die Ausgabe aussehen, wenn schon vorher die Weiterleitung woandershin ausgelöst wurde?

        Sie steht halt im Body der Response. Und der Browser könnte sie anzeigen, wenn das automatische Aufrufen des Umleitungsziels ausgeschaltet wäre. Aber wer macht das schon.

        dedlfix.

        1. Und der Browser könnte sie anzeigen, wenn das automatische Aufrufen des Umleitungsziels ausgeschaltet wäre.

          Aber in diesem Fall stimmt die angezeigte Information nicht ;)

          1. Hallo

            Und der Browser könnte sie anzeigen, wenn das automatische Aufrufen des Umleitungsziels ausgeschaltet wäre.

            Aber in diesem Fall stimmt die angezeigte Information nicht ;)

            Warum nicht? Die Aussage „You were successfully logged out!“ bezieht sich auf eine vor der Umleitung stattgefunden habende Aktion und ist, wenn das korrekt abgelaufen ist, auch nach der nicht funktioniert habenden Umleitung nicht falsch.

            Tschö, Auge

            --
            Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
            Wolfgang Schneidewind *prust*
            1. Ups, verlesen. Dachte an "Sie werden weitergeleitet". My bad.

              Cheers,
              BaBa

              --
              BaBa kommt von Basketball
              1. Hallo

                Ups, verlesen. Dachte an "Sie werden weitergeleitet". My bad.

                Nicht nur du. Dass der Text an sich am Thema vorbeigeht, ist erst @Tabellenkalk aufgegangen. :-)

                Tschö, Auge

                --
                Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
                Wolfgang Schneidewind *prust*
        2. Hallo und guten Tag,

          Sie steht halt im Body der Response. Und der Browser könnte sie anzeigen, wenn das automatische Aufrufen des Umleitungsziels ausgeschaltet wäre. Aber wer macht das schon.

          Das machen nur diejenigen Leute ausschließlich zum Testen, die wissen, was sie da tun.

          Denn prinzipiell macht man damit das Browser-Server-Prinzip kaputt. Ein Browser, der mit dem passenden HTTP-Status-Code dazu aufgefordert wird, sich das Ergebnis des letzten Requests anderswo abzuholen und dies nicht tut, der ist nicht mehr normgerecht und somit kaputt.

          Grüße
          TS

          --
          es wachse der Freifunk
          http://freifunk-oberharz.de
          1. Tach!

            Sie steht halt im Body der Response. Und der Browser könnte sie anzeigen, wenn das automatische Aufrufen des Umleitungsziels ausgeschaltet wäre. Aber wer macht das schon.

            [...] Denn prinzipiell macht man damit das Browser-Server-Prinzip kaputt. Ein Browser, der mit dem passenden HTTP-Status-Code dazu aufgefordert wird, sich das Ergebnis des letzten Requests anderswo abzuholen und dies nicht tut, der ist nicht mehr normgerecht und somit kaputt.

            Bei meiner Recherche fand ich immer wieder, dass die Norm eigentlich vorsieht, dass die Umleitung nicht stillschweigend durchgeführt werden darf, sondern vom Nutzer abgenickt werden muss. Wenn das nicht in irgendeinem Nachfolge-Papier aufgehoben wurde, wären alle Browser in dem Punkt nicht normgerecht.

            dedlfix.

      2. Hi,

        Die Lösung sieht in deinem Fall trivial aus: Tausche einfach die Zeilen 5 und 6.

        Nein, er soll die Zeile 5 weg lassen.

        stimmt, die Ausgabe ist unsinnig, wie wird nie angezeigt ...

        Wie wird die Ausgabe aussehen, wenn schon vorher die Weiterleitung woandershin ausgelöst wurde?

        Gute Frage. Nächste Frage? ;-)

        Übrigens verlangt die HTTP-Spezifikation, dass der Location-Header eine vollständige, absolute URL enthält. Die meisten Clients scheinen wohl auch relative URLs zu akzeptieren, aber in Ordnung ist das nicht.

        Das stimmt, wie mir selbst nach einer gleichlautenden Warnung gesagt wurde, nicht mehr. Der Standard wurde an das fehlertolerante Verhalten der Browser angepasst, Relative Adressen sind mittlerweile erlaubt und werden, wie relative Links auch, vom Browser zu absoluten Adressen ergänzt.

        Interessant, danke für den Hinweis.

        Ciao,
         Martin

        --
        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
        - Douglas Adams, The Hitchhiker's Guide To The Galaxy
  3. Hallo

    … Nachdem Logout soll erscheinen "Herzlich Willkommen, Username". Danach soll man zur Startseite umgeleitet werden. Das mit dem einloggen funktioniert, aber anstatt umgeleitet zu werden, erhält man diese Fehlermeldung:

    Warning: Cannot modify header information - headers already sent by (output started at /users/xxxxx/www/res/logout.php:5) in /users/xxxxx/www/res/logout.php on line 6.

    Eine Umleitung wird per Header ausgelöst. Header können nur gesendet werden, solange keine andere Ausgabe erfolgt ist. Mit …

    <?php
    session_start();
    session_destroy();
    
    echo 'You were successfully logged out!';
    header ("Location: index.php");
    ?>
    

    … kann das nicht funktionieren, da mit echo 'You were successfully logged out!'; eben doch eine Ausgabe gesendet wird. Die folgende Anweisung header ("Location: index.php"); löst die von dir gezeigte Fehlermeldung aus. Entweder du verzichtest auf die Ausgabe vor der Umleitung oder du generierst ein HTML-Dokument mit der meldung, aber ohne Umleitung per Header. Die Weiterleitung kann von dort aus zeitgesteuert per HTML-Element ausgelöst werden.

    Gib dann aber bitte auch einen Link zum Weiterleitungsziel an, damit diejenigen, bei denen die Weiterleitung nicht funktioniert, oder die die Wartezeit nicht abwarten wollen, per Linkbetätigung weiter kommen.

    Tschö, Auge

    --
    Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
    Wolfgang Schneidewind *prust*
  4. Hallo,

    Nachdem Logout soll erscheinen "Herzlich Willkommen, Username".

    Warum?

    Gruß
    Kalk

    1. Hallo

      Nachdem Logout soll erscheinen "Herzlich Willkommen, Username".

      Warum?

      *gnarf?* Das Offensichtliche fällt zuletzt auf. :-)

      Warum wird jemand, der sich verabschiedet (ausloggt), willkommen geheißen? Und woher stammt nach dem Logout die Information „Username“?

      Tschö, Auge

      --
      Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
      Wolfgang Schneidewind *prust*
  5. Nun, Du darfst also den Header nicht nach der Nachricht senden. Wenn es mal unumgänglich sollte, dann lese AB HIER nach.

    Du kannst aber auch nicht hingehen und den header vor der Nachricht senden, denn dann wird diese, wenn überhaupt, nur sehr kurz angezeigt.

    Gängige Lösung: http-equiv="refresh"

    <?php
    ## config:
    $config['time2wait']   = 2;
    $config['targetUri']   = "Deine Zieladresse";
    $config['headline']    = "Deine Überschrift";
    $config['description'] = "Deine Meldung";
    
    ## program:
    session_start();
    session_destroy();
    ?>
    <!doctype html>
    <html>
        <head>
            <meta name="robots" content="noindex, follow" /><!-- soll nicht gefunden werden -->
            <meta http-equiv="refresh" content="<?=intval($config['time2wait']); ?>; URL=<?=$config['targetUri']; ?>">
        </head>
        <body>
            <h1><?=htmlspecialchars($config['headline']); ?></h1>
            <p><a href="<?=$config['targetUri']; ?>"><?=htmlspecialchars($config['description']); ?></a></p>
        </body>
    </html>
    
    • Hint: Der Link ist nötig, weil sich manche nicht automatisch weiterschicken lassen.
    • Hint: Alle Lösungen hierfür, die Javascript verwenden, sind unnötig und also Mist.
  6. Hallo und guten Tag,

    Ich habe seit 2-3 Tagen mit dem Problem zu kämpfen, dass bei meinem Logout-Script die Weiterleitung nicht funktioniert. Nachdem Logout soll erscheinen "Herzlich Willkommen, Username". Danach soll man zur Startseite umgeleitet werden. Das mit dem einloggen funktioniert, aber anstatt umgeleitet zu werden, erhält man diese Fehlermeldung:

    Warning: Cannot modify header information - headers already sent by (output started at /users/xxxxx/www/res/logout.php:5) in /users/xxxxx/www/res/logout.php on line 6.

    Hier der Code:

    <?php
    session_start();
    session_destroy();
    
    echo 'You were successfully logged out!';
    header ("Location: index.php");
    ?>
    

    Da bringst Du nun auch das komplette Prinzip "Request und Response" durcheinander. Soll die Ressource "logout.php" (oder wie sie eben heißt) nun eine neue Webseite generieren, die dann beim Browser angezeigt wird, oder soll sie den Browser bitten, sich den neuen Inhalt von einer anderen Ressource (index.php) zu holen? Dann sollte die erfolgreiche "Logout-Operation" vorher für diese Ressource hinterlegt werden, damit sie diese Information auch in die Ausgabe (neues HTML-Dokument) einbauen kann.

    Dazu wäre es natürlich hilfreich, wenn Du "Logout" und "Session" nicht auch verwechseln würdest. Woher soll denn die Ressource "index.php" sonst wissen, für welchen User die Information "Du wurdest erfolgreich abgemeldet" hinterlegt wurde?

    Wenn Du ein wenig (zeitliche) Struktur in dein Multithreading-System (das ist es nämlich, weil jeder User seinen eigenen Thread bekommen muss) bringen möchtest, könnten wir das nochmal ausführlicher disktutieren :-)

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de