Lupus: Session-Gültigkeit für Unter-Ordner

Guten Tag,

Nach einer langen Google- und Forumsuche habe ich noch immer nichts gefunden, was mir weiter helfen könnte.
Ich möchte, dass für bestimmte Ordner jeweils eine eigene Session gültig ist.
Dafür lege ich in PHP den Cookie-Path fest:

  
<?php  
  ini_set('session.cookie_path', 'Absoluter/Pfad/Zum/Ordner/');  
  session_start();  
?>  

Das Problem dabei ist aber, dass jetzt bei jedem Seitenaufruf (der index.php dieses Ordners) eine neue Session gestartet wird.
Ich habe zu diesem Thema auch schon diese Dikussion gelesen, das hat mir aber nicht weiter geholfen.

Was für Einstellungen oder Funktions-Aufrufe fehlen, damit nicht bei jedem Seitenaufruf eine neue Session generiert wird?

Herzlichen Dank,
Lupus

  1. Grüße,
    ich hatte das gleiche problem auch - cookie werden nciht überschrieben sondern neu angelegt.

    vllt kann man einen anderen ansatz - mit function_name() versuchen?

    kA ob das geht, aber...
    MFG
    bleicher

  2. Das Problem dabei ist aber, dass jetzt bei jedem Seitenaufruf (der index.php dieses Ordners) eine neue Session gestartet wird.

    Wie fragst Du denn die Existenz des Extra-Cookies ab?
    Wenn er vorhanden ist, musst Du dich vermutlich im passenden Pfade befinden, sonst hätte ein intakter Browser den Cookie nicht mit zurückgesandt. Dann kannst Du die spezielle Session mittels dieses Cookies starten, die normale Session dann allerdings nicht.

    Siehe

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Wie fragst Du denn die Existenz des Extra-Cookies ab?

      Gar nicht. Ist das nicht die Standard-Einstellung von PHP, das die Session in ein Cookie gespeichert wird und dieses ggf. erstellt oder überschrieben wird?

      Wenn er vorhanden ist, musst Du dich vermutlich im passenden Pfade
      befinden, sonst hätte ein intakter Browser den Cookie nicht mit
      zurückgesandt. Dann kannst Du die spezielle Session mittels dieses
      Cookies starten, die normale Session dann allerdings nicht.

      Kann das Problem sein, das ich den session.cookie_path in der Datei [...]/includes/includes.php festlege und diese von der Datei [...]/unter/ordner/index.php includiert wird. D.h. also, dass ich mich im falschen Pfad befinde, wenn ich die session starte?
      Ich verstehe nicht, was du meinst mit: "die spezielle Session mittels dieses Cookies starten".

      Vermutlich ein Schreibfehler. Ein absoluter Pfad beginnt mit /

      Ja, meinte ich.

      vllt kann man einen anderen ansatz - mit function_name() versuchen?

      Du meinst wohl: session.name? Den Session-Namen zu verändern hat auch nichts gebracht.

      1. Hello,

        Wie fragst Du denn die Existenz des Extra-Cookies ab?

        Gar nicht. Ist das nicht die Standard-Einstellung von PHP, das die Session in ein Cookie gespeichert wird und dieses ggf. erstellt oder überschrieben wird?

        Dann solltset Du Dir zum Testen
        a) die Cookies anzeigen lassen, die am Browser ankommen
        b) im Script die Cookies anzeigen lassen, die dort wieder ankommen.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. echo $begrüßung;

        Vermutlich ein Schreibfehler. Ein absoluter Pfad beginnt mit /
        Ja, meinte ich.

        Vom meinen hat sich ein Computer noch nie überzeugen lassen. Schau doch mal nach, was wirklich passiert. Installier dir zum Firefox die livehttpheaders-Extension und wirf einen Blick auf Request und Response. Sind Session-Cookies dabei? Funktioniert der Session-Mechanismus eigentlich grundsätzlich, wenn du keinen cookie_path vorzugeben versuchst?

        echo "$verabschiedung $name";

        1. Vom meinen hat sich ein Computer noch nie überzeugen lassen.

          Mit meinen meinte ich, dass ich es im Quellcode richtig geschriben habe, aber falsch ins Forum übertragen habe... ;-)

          Schau doch mal nach, was wirklich passiert. Installier dir
          zum Firefox die livehttpheaders-Extension und wirf einen Blick
          auf Request und Response. Sind Session-Cookies dabei?

          Bei jedem Request wird ein Cookie mit dem Namen "PHPSESSID" und einer neuen session_id() gesetzt.

          Ich lasse die Cookie zum Testen auch im Script anzeigen:
          <?php echo "<pre>"; print_r($_COOKIE); echo "</pre>";?>
          Mit einem modifizierten session.cookie_path werden keine Cookies angezeigt. Es sind (im Browser?) jedoch 2 Cookies gesetzt worden (sie werden im Add-Ons Firecookie und Firebug angezeit).
          Wenn ich den cookie_path auskommentiere, wird im Array $_COOKIE wie erwartet das "PHPSESSID-Cookie" angezeit und alles funktioniert wieder wie erwartet.

          Funktioniert der Session-Mechanismus eigentlich grundsätzlich, wenn
          du keinen cookie_path vorzugeben versuchst?

          Ja, ohne die "session.cookie_path Angabe" funktioniert alles wunderbar. Das Problem ist, dass ich Logins verschiedene Login-Bereiche in den Unter-Ordnern habe und man in allen eingeloggt wird, wenn $_SESSION['usernsme'] vorhanden ist. Deshalb ist es so, dass wenn man in einem Bereich eingeloggt ist, man automatisch auch in anderen angemeldet ist. Das soll natürlich nicht so sein.

          1. echo $begrüßung;

            Mit einem modifizierten session.cookie_path werden keine Cookies angezeigt. Es sind (im Browser?) jedoch 2 Cookies gesetzt worden (sie werden im Add-Ons Firecookie und Firebug angezeit).

            Dann ist also der Browser bockig und will den Cookie-Pfad nicht mit dem URL-Pfad in Übereinstimmung sehen.

            Ja, ohne die "session.cookie_path Angabe" funktioniert alles wunderbar.

            Ich vermute ja immer noch einen Unterschied in beiden Pfadangaben.

            echo "$verabschiedung $name";

            1. Dann ist also der Browser bockig und will den Cookie-Pfad nicht
              mit dem URL-Pfad in Übereinstimmung sehen.

              Wie schon geschrieben; kann es daran liegen, dass die Datei, in der session.cookie_path definiert wird in einem anderen Ordner liegt und der Browser es deshalb als "falschen" Pfad erkennt?
              Oder kann es daran liegen, dass ich ModRewrite verwenden und es somit den "Request-Folder" gar nicht gibt, weil er aus dem GET-Query in einen Ordner umbenannt wird?

              RewriteRule ^([-0-9a-zA-Z/_]*)$ index.php?path=$1&%{QUERY_STRING}

              Ich vermute ja immer noch einen Unterschied in beiden Pfadangaben.

              Ich könnte mir nicht erklären, was ich daran ändern muss. Der Pfad wird "dynamisch" erzeugt von PHP:

                
              <?php  
                $abspath = rtrim($_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF']), "/\\")."/";  
                define('ABSPATH', $abspath);  
              ?>  
              
              

              Der Slash am Ende spielt keine Rolle, habe ich schon ausprobiert.

              Ich bin um jeden Rat dankbar!

              1. echo $begrüßung;

                Dann ist also der Browser bockig und will den Cookie-Pfad nicht
                mit dem URL-Pfad in Übereinstimmung sehen.

                Wie schon geschrieben; kann es daran liegen, dass die Datei, in der session.cookie_path definiert wird in einem anderen Ordner liegt und der Browser es deshalb als "falschen" Pfad erkennt?

                Dateien sind für den Browser uninteressant. Er fordert eine Ressource unter einer bestimmten URL an. Cookies müssen zur URL passen. In welcher serverseitigen Datei der Keks erzeugt wird ist uninteressant.

                Oder kann es daran liegen, dass ich ModRewrite verwenden und es somit den "Request-Folder" gar nicht gibt, weil er aus dem GET-Query in einen Ordner umbenannt wird?

                Auch das serverinterne Umschreiben bekommt der Browser nicht.

                $abspath = rtrim($_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF']), "/\")."/";
                  define('ABSPATH', $abspath);

                Der Pfad zum DocumentRoot ist für den Browser ebenfalls uninteressant. Beschränke dich auf das was der Browser sieht, also die angeforderte URL und passe den Cookie-Path darauf an. Dann wird alles gut werden.

                echo "$verabschiedung $name";

                1. Der Pfad zum DocumentRoot ist für den Browser ebenfalls uninteressant.
                  Beschränke dich auf das was der Browser sieht, also die angeforderte
                  URL und passe den Cookie-Path darauf an. Dann wird alles gut werden.

                  Wow, super! Hat natürlich gleich auf anhieb funktioniert.
                  Für die Nachwelt:

                    
                  <?php  
                    $abspath = rtrim($_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF']), "/\\")."/";  
                    define('ABSPATH', $abspath);  
                    ini_set('session.cookie_path', str_replace($_SERVER['DOCUMENT_ROOT'], "", ABSPATH));  
                    session_start();  
                  ?>
                  

                  Herzlichen Dank für jede Hilfe!

                  1. echo $begrüßung;

                    $abspath = rtrim($_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF']), "/\")."/";
                      define('ABSPATH', $abspath);

                    Warum definierst du zuerst eine Variable und dann daraus eine Konstante? Nun hast du den gleichen Wert zweimal rumliegen. Definier die Konstante doch lieber gleich ohne Umweg.

                    ini_set('session.cookie_path', str_replace($_SERVER['DOCUMENT_ROOT'], "", ABSPATH));

                    Und wozu ist nun der absolute Pfad zum DocumentRoot noch nötig? Ermittle den Cookie-Pfad doch gleich aud dem PHP_SELF-Wert. Noch besser wäre es, REQUEST_URI abzüglich Querystring zu verwenden. Denn das ist das was der Browser sieht und angefordert hat, auch wenn mod_rewrite den Request umgeschrieben hat. Allerdings ist REQUEST_URI mit Vorsicht zu genießen, das wird nicht immer von allen Umgebungen in gleicher Weise bereitgestellt. Gegebenenfalls muss man sich mit phpinfo(INFO_VARIABLES); ansehen was bei verschiedenen Aufrufszenarien beim Script ankommt.

                    echo "$verabschiedung $name";

          2. Hello,

            Bei jedem Request wird ein Cookie mit dem Namen "PHPSESSID" und einer neuen session_id() gesetzt.

            Von wem? Vom Standard-Session-Mechanismus von PHP oder von Deinem selbst installierten?

            Ein session_start() wird auf jeden Fall den Standard-Mechanismus in Gang setzen.
            Den kannst du nicht aushebeln, nur beeinflussen.

            session_name() http://www.php.net/manual/de/function.session-name.php ist ein geeignetes Mittel dafür.

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Von wem? Vom Standard-Session-Mechanismus von PHP
              oder von Deinem selbst installierten?

              Das Cookie wird "normal" mit session_start() erzeugt.
              Ich habe keinen eigenen Session-Start-Mechanismus gebaut?
              Kann ich denn eine Session manuell starten, einfach in dem ich das Cookie aufrufe und verarbeite?
              Wenn ja, ich muss ich es verarbeiten?

              session_name() http://www.php.net/manual/de/function.session-name.php ist ein geeignetes Mittel dafür.

              Ich habe schon versucht, den Session-Namen zu verändern:

                
              <?php  
                ini_set('session.name', 'SID');  
                // Oder ein anderer, eigener Session-Name  
              ?>  
              
              ~~~hat kein unterschied gemacht, ausser dass die Cookies anders hiessen.  
              Oder wie meinst du damit, dass ich mit session\_name() einfluss auf session\_start() nehemn kann?
              
              1. Hello,

                Das Cookie wird "normal" mit session_start() erzeugt.
                Ich habe keinen eigenen Session-Start-Mechanismus gebaut?

                Wie es aussieht, wohl nicht.
                Wenn Du session_start() aufrufst, werden die Voreinstellungen benutzt.
                http://www.php.net/manual/de/session.configuration.php#ini.session.cookie-path
                Die kannst du aber _vor_ der Benutzung von session_start() verändern.

                Liebe Grüße aus Syburg bei Dortmund

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Wie es aussieht, wohl nicht.
                  Wenn Du session_start() aufrufst, werden die Voreinstellungen benutzt.
                  http://www.php.net/manual/de/session.configuration.php#ini.session.cookie-path
                  Die kannst du aber _vor_ der Benutzung von session_start() verändern.

                  Na, aber natürlich habe ich den Cookie-Pfad vor dem session_start() geändert.
                  Steht im ersten Post.

                    
                  <?php  
                    ini_set('session.cookie_path', 'Absoluter/Pfad/Zum/Ordner/');  
                    session_start();  
                  ?>
                  

                  Oder werden die ini_set Einstellungen nicht mehr beachtet, wenn ich dann doch einen session_start() ausführe? Was ich eigentlich nicht glauben kann...
                  Wie starte ich die Session dan ohne session_start()? Oder geschieht das ganz von alleine?

  3. echo $begrüßung;

    ini_set('session.cookie_path', 'Absoluter/Pfad/Zum/Ordner/');
    Das Problem dabei ist aber, dass jetzt bei jedem Seitenaufruf (der index.php dieses Ordners) eine neue Session gestartet wird.

    Vermutlich ein Schreibfehler. Ein absoluter Pfad beginnt mit /

    echo "$verabschiedung $name";