Ermöglichen Sie PHP-Sitzungen die Übertragung auf Subdomains


74

Ich verwende PHP-Sitzungen (keine Cookies, außer Cookies für Sitzungs-IDs) für alle Benutzerdaten. Wenn ein Benutzer zu seinem Profil user.mydomain.com wechselt, wird er sofort "abgemeldet", bis die Subdomain entfernt wird.

Gibt es eine Möglichkeit, Sitzungen aus allen Domänen zu akzeptieren, solange es sich um * .mydomain.com handelt?


1
Erst dannini_set('session.cookie_domain', '.example.com') , dann session_start() oder Session::start()von github.com/delight-im/PHP-Cookie
caw

Antworten:


92

Hier sind 4 Optionen.

Platziere dies in deiner php.ini:

session.cookie_domain = ".example.com"

Oder in Ihrem .htaccess:

php_value session.cookie_domain .example.com

Oder als erstes in Ihrem Skript:

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

Oder in Ihrer PHP-Fpm-Pool-Konfiguration für Ihre Site:

php_value[session.cookie_domain] = .example.com

2
Leider haben alle 3 nicht funktioniert. Muss es einen Stern * geben?
Anthony

2
Sehr seltsam, ich habe diese Methoden schon einmal verwendet und sie funktionieren gut. Haben Sie zufällig Suhosin installiert? Ich erinnere mich, dass eine Einstellung geändert werden musste, um dies zu ermöglichen. Wenn nicht, können Sie weitere Informationen zu Ihrer Installation veröffentlichen (z. B. Apache, LightTPD, PHP-Version)?
CTT

4
@ CTT bitte fügen Sie Ihrer Antwort eine vierte Option hinzu: session_set_cookie_params(0, '/', 'example.com', false, false);
Heilige Socken

6
Vergessen Sie nicht, den Browser tatsächlich zu schließen und dann wieder zu öffnen. Sonst gehst du im Kreis! .. ich tat
AndrewC

9
Eine weitere Erinnerung für dumme Leute wie mich: Stellen Sie sicher , ini_set('session.cookie_domain', '.example.com');kommt vor session_start();
Ben Y

13
        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 sei verdammt, wenn Sie mit unvollständigen oder schlechten Antworten genauso frustriert sind wie ich, ist dies Ihr Retter. Es funktioniert einfach.


3
Das hat bei mir funktioniert, aber ich verstehe das Sicherheitsproblem nicht. Würde es Ihnen etwas ausmachen zu erklären, welche Sicherheitsprobleme vorhanden sein könnten?
Neo

5

Ändern Sie den Sitzungsnamen oben in der Kernfunktionsdatei wie

 session_name('mysession');

Verwenden Sie dann den folgenden Code in die PHP-Seite

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

Ändern Sie schließlich den Standard-Sitzungsnamen der Subdomain und entfernen Sie das Standard-Cookie in der Kernfunktionsdatei der Subdomain wie folgt:

 /*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 Ihren Cookie-Namen weiterhin als PHPSESSID verwenden, entfernen Sie einfach alle Funktionen mit

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

Überprüfen Sie dann die vorhandenen Cookies Ihres Browsers, entfernen Sie einfach alle Cookies der Domain und Subdomain und wiederholen Sie den Vorgang.


Das hat den Job für mich gemacht. Keine der anderen Antworten in dieser Frage hat funktioniert.
Art Geigel

4

Ich weiß, dass dies ziemlich alt ist - aber um den Vorschlag von @ CTT weiter zu erweitern - musste ich in jedem Unterverzeichnis (das PHP-Code ausführt und die Sitzung erfordert) meiner Unterdomäne eine php.ini-Datei mit dem folgenden Text hinzufügen:

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

Ich hoffe, das hilft (ich habe ewig gebraucht, um das herauszufinden).


Dieser ist böse und debuggt seit 2 Stunden, da das Teilen von Sitzungen in meiner lokalen Umgebung einwandfrei funktioniert hat. sollte Suhosin Einstellungen früher überprüft haben
Weyandch

4

Eine andere Option, die für mich funktioniert hat, besteht darin, den Namen der Sitzung zu erzwingen:

session_name("myWebsite");
session_start(); 

1
Dies scheint bei weitem die einfachste Lösung zu sein
Adam

3

Ja. ini_setfunktioniert. Denken Sie jedoch daran, alle Caches und Cookies des Browsers zu zerstören, damit dies funktioniert.

  1. Zerstören Sie alle Caches und Cookies Ihres Browsers
  2. in deinem xxx.example.comund yyy.example.comsollten deine PHP-Dateien so beginnen.

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

0

Ich hatte gerade dieses Problem und es stellte sich heraus, dass ich verschiedene php.ini-Dateien für zwei verschiedene Subdomains verwendete. Diese INI-Dateien haben verschiedene session.save_path- Variablen angegeben. Aus offensichtlichen Gründen muss dies für alle Subdomänen gleich sein, die Sitzungen gemeinsam nutzen müssen.


0

Versuche dies:

session_start(); 

$sessionId =  session_id();

protokollierte den Benutzer. Wenn der Benutzer zu einer anderen Subdomain wechselt, wird die Sitzungs-ID in der URL wie folgt gesendetuser.mydomain.com/?id=$sessionId

$sessionId =  $_GET['id'];

session_start($sessionId); 

Jetzt erhält der Benutzer alle Sitzungswerte und bleibt angemeldet.


6
Wenn Ihre Antwort mit "versuchen Sie dies" beginnt, machen Sie es falsch.
Jay Blanchard

0

Vor dem session_start()Gebrauch session_set_cookie_params()ersetzen .domain.com mit Ihrer Domain wie in diesem Beispiel:

session_set_cookie_params(0, '/', '.domain.com');
session_start();

-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, die Sie jedoch nicht in allen Situationen verwenden können. Zum Beispiel funktioniert es nicht, wenn Sie sich nicht auf Cookies verlassen können, die keine Sitzung sind.

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()und auch in alle Dateien setzen, die aufrufensession_start()

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.