Sven Burkert: mod_rewrite und Session

Hallo,

sobald ich meine .htaccess-Datei aktiviere, funktionieren auf meiner Webseite keine PHP-Sessions mehr.

Ich vermute mal, dass das Cookie, in der die Session gespeichert wird, durch die URL-Umwandlungen in htaccess nicht mehr gefunden wird, oder?

Die htaccess sieht so aus:

Options +SymLinksIfOwnerMatch

RewriteEngine On

sbtheke.de/madtv weiterleiten

RewriteCond %{HTTP_HOST} ^(www.)?sbtheke.de
RewriteRule ^(.*)madtv/(.*)$ http://www.madtv-online.com [R,L]

Ausschluss von Verzeichnissen

RewriteRule ^(madtv|madtv2) - [L]

MadTV liegt im Unterordner "madtv"

RewriteCond %{HTTP_HOST} ^(www.)?madtv-online.com
RewriteRule ^(.*) /madtv/$1 [L]

  1. Hi,

    Ich vermute mal, dass das Cookie, in der die Session gespeichert wird, durch die URL-Umwandlungen in htaccess nicht mehr gefunden wird, oder?

    richtig. Du forcierst einen Redirect über den Client, der ergo eine neue Ressource anfordert und auch neu entscheidet, welche Cookies mitgeliefert werden. Da es sich um eine komplett neue Domain handelt, ist es unmöglich[1], dass jemals irgend ein Cookie auf beiden Systemen nutzbar ist. Wenn Du Deinen Server also nicht zum Proxy machen möchtest[2], bleibt Dir nur, einen anderen Weg der Session-Identifizierung zu wählen.

    Cheatah

    [1] Bei der derzeitigen Implementierung der Cookie-Standards.
    [2] Wobei ich gerade nicht auswendig weiß, ob Cookies hierbei weitergeleitet werden.

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. richtig. Du forcierst einen Redirect über den Client, der ergo eine neue Ressource anfordert und auch neu entscheidet, welche Cookies mitgeliefert werden.

      Ok, ich habe nun die Zeilen mit dem Redirekt rausgeworfen - trotzdem wird bei jedem Seitenaufruf eine neue Session-ID generiert. Wieso das?

  2. Hallo,

    jetzt mal so ins Blaue rein: Hast Du in Deiner httpd.conf für dieses Verzeichnis die Regel AllowOverride gesetzt ?

    Funktionieren die nur die Sessions nicht mehr oder bekommst Du eine Fehlermeldung des Servers ?

    ciao Andreas

    1. jetzt mal so ins Blaue rein: Hast Du in Deiner httpd.conf für dieses Verzeichnis die Regel AllowOverride gesetzt ?

      Nein, habich nicht. Sollte ich?

      Funktionieren die nur die Sessions nicht mehr oder bekommst Du eine Fehlermeldung des Servers ?

      Die Anweisungen in der htaccess funktionieren wunderbar und machen genau das, was sie sollen :) Nur die Sessions funktionieren nicht mehr, erst wenn ich die htaccess lösche gehen Sessions wieder.

      1. Hallo,

        Optionen innerhalb einer htaccess werden nur dann akzeptiert, wenn Du in der httpd.conf die Erlaubnis dazu gibst. Das geschieht mit Allowoverride und der betreffenden Option. Wenn Dein Apache allerdings mit
        AllowOverride none
        eingestellt ist, ziehen Deine Options aus der htaccess nicht.

        Da Du aber schreibt, daß sonst alles funktioniert, vermute ich, daß Du den AllowOverride richtig eingestellt hast oder dieser defaultmäßig in Deiner httpd.conf auf
        AllowOverride all
        eingestellt ist. Falls das zweite der Fall ist, solltest Du darauf achten, daß in Deinem htaccess-Verzeichnis kein fremder Schreibrechte hat, da dieser sonst keine Schweinereien anrichten kann, indem er Deine htaccess anpasst.

        Kannst Du mal den Anfang Deiner php-Datei liefern ?
        Mich würde interessieren, wie Du Deine Sessions anwendest.

        ciao Andreas

        1. Kannst Du mal den Anfang Deiner php-Datei liefern ?
          Mich würde interessieren, wie Du Deine Sessions anwendest.

          Ich hab 2 PHP Dateien. In der ersten schreibe ich einen Wert in die Session, in der 2. lese ich diesen Wert aus.

          Allerdings ist die Session-ID immer eine andere, wenn ich die erste Datei mehrmals aufrufe:

          session_start();
          $_SESSION['ss'] = "ddd";
          echo print_r($_SESSION);
          echo session_name()."sessid=".session_id();

          1. Hallo Sven,

            war zwischenzeitlich was essen. Muß auch mal sein ;-)

            Ich werfe mal wertfrei ein paar Ideen in den Raum:

            • Ist die php.ini auf beiden Servern die gleiche ?
            • Machst Du ein session_destroy ?
            • Funktionierte das schon mal bei Dir ?

            Poste mal alle Deine php.ini-Einstellungen, die mit session beginnen

            ciao Andreas

              • Ist die php.ini auf beiden Servern die gleiche ?

              Ich habe 2 Domains und ein Hostingpaket - also die gleiche php.ini

              • Machst Du ein session_destroy ?

              Nein

              • Funktionierte das schon mal bei Dir ?

              Es funktioniert, wenn ich die htaccess lösche

              Poste mal alle Deine php.ini-Einstellungen, die mit session beginnen

              Kann dir nur die phpinfo posten:

              session.auto_start Off Off
              session.bug_compat_42 On On
              session.bug_compat_warn On On
              session.cache_expire 180 180
              session.cache_limiter nocache nocache
              session.cookie_domain sbtheke.de no value
              session.cookie_lifetime 0 0
              session.cookie_path / /
              session.cookie_secure Off Off
              session.entropy_file no value no value
              session.entropy_length 0 0
              session.gc_divisor 100 100
              session.gc_maxlifetime 1440 1440
              session.gc_probability 1 1
              session.name PHPSESSID PHPSESSID
              session.referer_check no value no value
              ..
              session.save_path /tmp /tmp
              session.serialize_handler php php
              session.use_cookies On On
              session.use_only_cookies On Off
              session.use_trans_sid Off Off

              Interessant ist bestimmt, dass cookie_domain sbtheke.de ist. Aber wieso funktionieren die Cookies, die ich selbst setze?

              1. Hi,

                versuche mal
                session.cookie_domain =
                Versuche mal mit
                ini_set ( "session.cookie_domain", "" );
                Deine Domain auf Standard zu setzen. Befürchte aber schon, daß das nicht funktioniert, da die Provider sowas meist verhindern.
                Ansonsten weiß ich jetzt auch nicht mehr weiter, sorry.

                ciao Andreas

                1. ini_set ( "session.cookie_domain", "" );

                  Cool, scheint zu funktionieren: Beim mehrmaligen Aufruf von der Test-PHP-Datei (die mir die Session-ID ausgibt) habe ich nun immer die gleiche :)