2009-03-13 8 views
59

Ich benutze PHP-Sitzungen (keine Cookies, außer Sitzungs-ID-Cookie) für alle Benutzerdaten, und wenn ein Benutzer zu seinem Profil user.mydomain.com geht, werden sie sofort "ausgeloggt" Bis dahin entfernen Sie die Subdomain.Erlaube, dass PHP-Sitzungen zu Subdomains übertragen werden

Gibt es eine Möglichkeit Sitzungen von allen Domänen, solange sein * .mydomain.com

+0

Zuerst 'ini_set ('session.cookie_domain', '.example.com')', * dann * 'session_start()' oder 'Session :: start()' von https://github.com/delight-im/PHP-Cookie – caw

Antwort

74

Hier sind vier Optionen zu akzeptieren.

Dieses in der php.ini:

session.cookie_domain = ".example.com" 

oder in der .htaccess:

php_value session.cookie_domain .example.com 

Oder als das erste, was in Ihrem Skript:

ini_set('session.cookie_domain', '.example.com'); 

Oder in Ihre php-fpm-Poolkonfiguration für Ihre Site:

+2

Leider haben alle 3 nicht funktioniert, muss es einen Stern geben *? – Anthony

+2

Sehr seltsam, ich habe diese Methoden schon früher benutzt und sie funktionieren gut. Haben Sie zufällig Suhosin installiert, ich erinnere mich, dass es eine Einstellung gab, die geändert werden musste, um dies zu ermöglichen? Wenn nicht, können Sie weitere Informationen über Ihre Installation veröffentlichen (zB Apache, Lighttpd, PHP-Version)? – CTT

+0

einige Pakete kommen mit Suhosin drauf. 'php -i | grep -i 'Suhosin'' um zu sehen, ob es da ist –

11
 if(isset($_COOKIE['session_id'])) 
      session_id($_COOKIE['session_id']); 
     Zend_Session::start(); //or session_start(); 
     if(!isset($_COOKIE['session_id'])) 
      setcookie('session_id', session_id(), 0, '/', '.yourdomain.com'); 

Sicherheit verdammt sein, wenn Sie so frustriert mit unvollständigen oder schlecht Antworten sind, wie ich bin, das ist dein Retter ist. Es funktioniert einfach.

+0

das funktionierte für mich, aber ich verstehe das Sicherheitsproblem nicht. Würde es Ihnen etwas ausmachen zu erklären, welche Sicherheitsprobleme es gibt? – Neo

-3
if(isset($_COOKIE['session_id'])) 
    session_id($_COOKIE['session_id']); 
    Zend_Session::start(); //or session_start(); 

    if(!isset($_COOKIE['session_id'])) 
     setcookie('session_id', session_id(), 0, '/', '.yourdomain.com'); 

Dies ist eine gute Lösung, aber Sie können es nicht in allen Situationen verwenden. Zum Beispiel wird es nicht funktionieren, wenn Sie sich nicht auf Nicht-Session-Cookies verlassen können.

Dies muss tatsächlich funktionieren, wenn Sie es richtig verwenden.

ini_set('session.cookie_domain', '.example.com'); 

Zum Beispiel müssen Sie es vor session_start() setzen und auch in allen Dateien, die session_start()

4

nenne ich weiß, das ist ziemlich alt - aber weiter auszubauen @ CTT Vorschlag - ich brauchte ein PHP hinzufügen Ini-Datei in jedem Unterverzeichnis (das wird pHP-Code wird die Ausführung und erfordert die Sitzung) meine Sub-Domain mit dem folgenden Text:

suhosin.session.cryptdocroot=Off 
suhosin.cookie.cryptdocroot=Off 

ich hoffe, das hilft (es hat mir im Alter um dies herauszufinden).

+0

Dieser ist böse, debugging seit 2 Stunden jetzt, da Session-Sharing auf meiner lokalen Umgebung gut funktioniert. sollte Suhosin Einstellungen früher überprüft haben – weyandch

2

Eine weitere Option, die für mich gearbeitet: ist der Name der Sitzung zu erzwingen:

session_name("myWebsite"); 
session_start(); 
0

Ich hatte gerade dieses Problem und es stellt sich heraus, dass ich verschiedene php.ini-Dateien für zwei verschiedene Sub-Domains wurde mit . Diese Ini-Dateien spezifizierten verschiedene session.save_path Variablen. Aus offensichtlichen Gründen muss dies für alle Subdomains, die Sitzungen gemeinsam nutzen müssen, gleich sein.

5

Änderung der Sitzungsnamen an der Spitze der Kernfunktionen Datei wie

session_name('mysession'); 

dann den folgenden Code in der Seite php

session_set_cookie_params(0,"/",".example.com",FALSE,FALSE); 
    setcookie(session_name(), session_id(),0,"/","example.com"); 
    session_start(); 

schließlich den Namen Standardsitzung der Sub-Domain ändern und entfernen Sie das Standard-Cookie in der Kernfunktionsdatei der Unterdomäne wie:

/*default session name*/ 
session_name("mysession"); 
/*remove the PHPSESSID and default session name from subdomain's cookie*/ 
setcookie("mysession", "",1,"/"); 
setcookie("PHPSESSID", "",1,"/"); 

, wenn Sie weiterhin mit Ihrem Cookie-Namen als PHPSESSID verwenden, entfernen Sie alle Funktionen mit

"mysession" string like session_name('mysession'), setcookie("mysession", "",1,"/"); 

dann das Browser vorhandene Cookies überprüfen, entfernen Sie alle Cookies von Domain-und Sub-Domain, und wiederholen Sie den Vorgang.

+0

Das hat den Job für mich getan. Keine andere Antwort in dieser Frage funktionierte. –

2

ja. ini_set funktioniert. Aber vergessen Sie nicht, alle Caches und Cookies des Browsers zu löschen, damit er funktioniert.

  1. zerstören alle Caches und Cookies Ihres Browsers
  2. in Ihrem xxx.example.com und yyy.example.com, Ihre PHP-Dateien wie folgt beginnen soll.

    ini_set('session.cookie_domain', '.example.com'); session_start();