tufi: redirect in PHP ohne Header

Hallo,

ich schreibe eine Seite mit Passwort geschütztem Bereich hauptsaechlich in PHP. Bevor ich zu meiner eigentlichen Problemstellung übergehe, kleine Vor-Erklaerung:

In meinem Skript benütze ich auch Sessions, wobei ich für das Sessionmanagament mittels session_set_save_handler() meine eigene funktionen definiert habe. Das Session-Management ist in einer Klasse gepackt, in der auch session_cache_limiter('nocache'); definiert ist.

Schon beim ersten Aufruf der Seite wird die Sessionklasse inkludiert und eine Session gestartet; dh. somit werden die Headers geschickt.

Ich habe auf jeder Seite die Möglichkeit eines Logins. Die Logininformationen werden mittels POST an die selbe Seite übergeben, und mittels PHP überprüft.

Wenn das Login erfolgreich ist, soll der User automatisch auf eine andere Seite, in meinem Fall frameset.php weitergeleitet werden.

Da jedoch alle Headerinformationes schon beim inkludieren der Session-Klasse geschickt werden, kann ich

Header("Location: frameset.php");

nicht einsetzen. Ich habe deswegen, für diesen fall einen kleinen JavaScript Code geschrieben, der seine Aufgabe auch wunderbar erledigt.

Nun die Frage, JavaScript funktioniert auch nur, wenn JavaScript auf dem Clientrechner aktiviert ist. (find ich logisch)

Hat jemand eine Idee wie Redirect ohne JavaScript besser hinkriegen kann, bzw. würdet ihr sagen, die Leute die JS nicht haben, sind in der Anzahl so gering, dass man sie vernachlaessigen kann ?

Ich würde mich auf Feedback freuen.

Gruss,

tufi

  1. Hallo tufi,

    Header("Location: frameset.php");
    nicht einsetzen. Ich habe deswegen, für diesen fall einen kleinen JavaScript Code geschrieben, der seine Aufgabe auch wunderbar erledigt.
    Nun die Frage, JavaScript funktioniert auch nur, wenn JavaScript auf dem Clientrechner aktiviert ist. (find ich logisch)
    Hat jemand eine Idee wie Redirect ohne JavaScript besser hinkriegen kann, bzw. würdet ihr sagen, die Leute die JS nicht haben, sind in der Anzahl so gering, dass man sie vernachlaessigen kann ?

    Wenn ich dich jetzt richtig verstanden habe, willst du nur den Clienten redirecten? Wie wär's damit:

    >> http://selfhtml.teamone.de/html/kopfdaten/meta.htm#weiterleitung

    Es gibt zwar auch leute, die das Meta-forwarding deaktiviert haben (Das kann selbst der IE *g*), aber garantiert viel weniger als die, die JS deaktiviert haben.

    Also

    <meta http-equiv="refresh" content="0; URL=<?php print $bla; ?>">

    im <head> dürfte dir helfen.

    WauWau

    --
    ss:) zu:) ls:< fo:~ de:] va:) ch:° n4:# rl:( br:< js:| ie:% fl:| mo:|
    WauWau E-Mail: coming soon
    1. Hallo,

      danke für die Antwort. Auf das Meta-refresh hatte ich in der Tat noch nicht gedacht. zwar, müsste ich den Aufbau von meinem Code etwas umaendern, aber scheint wirklich die bessere Lösung zu sein als JS.

      Danke für den Tipp. :)

      tufi

      1. Hallo tufi,

        danke für die Antwort. Auf das Meta-refresh hatte ich in der Tat noch nicht gedacht. zwar, müsste ich den Aufbau von meinem Code etwas umaendern, aber scheint wirklich die bessere Lösung zu sein als JS.

        ja, besser als JS ist es allemal, der Nachteil ist, dass es in den <head> reinmuss, hingegen kannst du dein <script>-Weiterleiter einfach irgendwo in den <body> schreiben, sollte es so wirklich nötig sein.

        WauWau

        --
        ss:) zu:) ls:< fo:~ de:] va:) ch:° n4:# rl:( br:< js:| ie:% fl:| mo:|
        WauWau E-Mail: coming soon
  2. Moin!

    In meinem Skript benütze ich auch Sessions, wobei ich für das Sessionmanagament mittels session_set_save_handler() meine eigene funktionen definiert habe. Das Session-Management ist in einer Klasse gepackt, in der auch session_cache_limiter('nocache'); definiert ist.

    Schon beim ersten Aufruf der Seite wird die Sessionklasse inkludiert und eine Session gestartet; dh. somit werden die Headers geschickt.

    Ich habe auf jeder Seite die Möglichkeit eines Logins. Die Logininformationen werden mittels POST an die selbe Seite übergeben, und mittels PHP überprüft.

    Wenn das Login erfolgreich ist, soll der User automatisch auf eine andere Seite, in meinem Fall frameset.php weitergeleitet werden.

    Da jedoch alle Headerinformationes schon beim inkludieren der Session-Klasse geschickt werden, kann ich

    Header("Location: frameset.php");

    nicht einsetzen.

    Sicher?

    Gibt deine Session-Klasse denn schon HTTP-Body-Content aus? Wenn nur irgendwelche HTTP-Header (egal ob Cookies, Session_start()-bedingt, oder für das Caching) gesetzt werden, beeinflußt das die Benutzbarkeit nachfolgender header()-Befehle keinesfalls.

    Vielleicht solltest du einfach mal headers_sent() abfragen - dann weißt du, ob PHP die Header schon geschickt hat und nochmaliges header() unzulässig wäre.

    Alle Ersatzlösungen sind nämlich nicht wirklich schön - egal ob Javascript oder Meta-Refresh.

    - Sven Rautenberg

    1. Hallo Sven,

      Sicher?

      jepp, das ist sicher;

      session_cache_limiter('nocache'); sendet schon die Headers.

      Wenn nur irgendwelche HTTP-Header (egal ob Cookies, Session_start()-bedingt, oder für das Caching) gesetzt werden, beeinflußt das die Benutzbarkeit nachfolgender header()-Befehle keinesfalls.

      hmm.. ich habe in der Klasse nur session_cache_limiter() benützt, was meines wissens die Headers sendet. Und dieser Befehl steuert ja auch das caching.  ...

      Vielleicht solltest du einfach mal headers_sent() abfragen - dann weißt du, ob PHP die Header schon geschickt hat und nochmaliges header() unzulässig wäre.

      ...habe ich; und headers_sent() ist bestaetigt mir, dass sie alle schon verschickt wurden.

      Alle Ersatzlösungen sind nämlich nicht wirklich schön - egal ob Javascript oder Meta-Refresh.

      ja, finde ich auch.. aber auf die Idee mit Meta-refresh war ich nicht gekommen. das scheint eine bessere Lösung als JS zu sein.

      danke für die Antwort,

      tufi

      1. Moin!

        jepp, das ist sicher;

        session_cache_limiter('nocache'); sendet schon die Headers.

        Kann nicht sein. Weil man diesen Befehl noch _vor_ session_start() aufrufen muß, und session_start() kann nicht arbeiten, wenn die Header schon gesendet wurden.

        Ich bin sicher, dass du irgendwo ein Leerzeichen oder eine Leerzeile in der ersten oder letzten Zeile vor <?php oder hinter ?> drin hast, und die dafür verantwortlich ist, dass die Header schon gesendet wurden.

        - Sven Rautenberg

        1. Moin!

          Ich bin sicher, dass du irgendwo ein Leerzeichen oder eine Leerzeile in der ersten oder letzten Zeile vor <?php oder hinter ?> drin hast, und die dafür verantwortlich ist, dass die Header schon gesendet wurden.

          headers_sent() gibt dir seit PHP 4.3.0 die Möglichkeit, den Dateinamen und die Zeile zu erfahren, in der die Header gesendet wurden. Schau einfach mal ins Manual, um die Anwendung dieses Features zu erfahren: http://de2.php.net/manual/de/function.headers-sent.php

          - Sven Rautenberg

        2. Moin!

          jepp, das ist sicher;

          session_cache_limiter('nocache'); sendet schon die Headers.

          Kann nicht sein. Weil man diesen Befehl noch _vor_ session_start() aufrufen muß, und session_start() kann nicht arbeiten, wenn die Header schon gesendet wurden.

          eben, ich benütze das ja auch, vor dem Session Start, der code von meiner Session-Klasse sieht so aus:

          include_once(INCLUDE_PATH.'/class.dbObjekt.inc');
          include_once(INCLUDE_PATH.'/functions.php');
          session_cache_expire(30);
          session_cache_limiter('nocache');
          session_name("sessionID");

          $ses_class = new session($params);

          session_set_save_handler(
          array(&$ses_class, '_open'),
          array(&$ses_class, '_close'),
          array(&$ses_class, '_read'),
          array(&$ses_class, '_write'),
          array(&$ses_class, '_destroy'),
          array(&$ses_class, '_gc'));

          // session Starten
          session_start();

          aber, ich werde die dateien, nach dem leerzeichen trotzdem überprüfen.

          danke.

          tufi

        3. Ich bin sicher, dass du irgendwo ein Leerzeichen oder eine Leerzeile in der ersten oder letzten Zeile vor <?php oder hinter ?> drin hast, und die dafür verantwortlich ist, dass die Header schon gesendet wurden.

          du hattest recht :o) ich habe in der Tat ein Leerzeichen hinter dem ?> entdeckt, und seit dieses weg ist funktioniert es wieder.

          danke für deine Hilfe.

          gruss,

          tufi

  3. Hi,

    Header("Location: frameset.php");

    Mal unabhängig von Deinem eigentlichen Problem: hier _muss_ laut HTTP-Standard eine absolute URI stehen, keine relative. Viele Browser sind so fehlertolerant, dass sie die relative URI trotzdem akzeptieren, allerdings kann man sich *nicht* darauf verlassen!

    Viele Grüße,
    Christian