it-swarm.com.de

PHP Sitzungen über Subdomains hinweg

Ich versuche folgendes einzurichten:

auth.domain.com
sub1.domain.com
sub2.domain.com

wenn der Benutzer die Website „sub1.domain.com“ oder „,22.domain.com “besucht und nicht angemeldet ist, wird er zu auth.domain.com verschoben und kann sich dort anmelden zwei separate Anwendungen, verwenden jedoch dieselben Anmeldeinformationen.

Ich habe versucht, folgendes in meiner php.ini einzustellen:

session.cookie_domain = ".domain.com"

es scheint jedoch nicht, dass die Informationen von einer Domäne zur anderen übertragen werden.

[Bearbeiten]

Ich habe folgendes versucht:

sub1.domain.com/test.php

session_set_cookie_params(0, '/', '.domain.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.domain.com/test.php">Change Sites</a>'

auth.domain.com/test.php

session_set_cookie_params(0, '/', '.domain.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

Die Sitzungs-IDs sind genau die gleichen, aber wenn ich die $ _SESSION-Variable entleere, werden nicht beide Schlüssel angezeigt, sondern nur der Schlüssel, den ich in jeder Domäne eingestellt habe.

[Bearbeiten 2]  

Ich habe aktualisiert [Bearbeiten]

87
dragonmantank

Ich weiß nicht, ob das Problem immer noch existiert, aber ich bin gerade auf das gleiche Problem gestoßen und habe es gelöst, indem ich einen Sitzungsnamen gesetzt habe, bevor ich session_set_cookie_params () aufrief:

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.some_domain.com');
session_start();

Ich habe nichts in meiner php.ini geändert, aber jetzt funktioniert alles gut.

127
jeroen

Eine Sache, die auf mysteriöse Weise verhindern kann, dass Sitzungsdaten in einer Subdomäne gelesen werden, obwohl Cookies auf .domain.com gesetzt sind, ist der PHP Suhosin-Patch. Sie können alles entsprechend den Beispielen in der Frage richtig konfiguriert haben, und es funktioniert einfach nicht.

Deaktivieren Sie die folgenden Suhosin-Sitzungseinstellungen, und Sie sind wieder im Geschäft:

suhosin.session.cryptua = Off 
suhosin.session.cryptdocroot = Off
24
drewm

Versuchen Sie es mit:

session.cookie_domain = "domain.com"

Anstatt:

session.cookie_domain = ".domain.com"

Beachten Sie die fehlende Periode.

Seien Sie jedoch vorsichtig, da dies nicht von allen Browsern unterstützt wird.

5
George Claghorn

Hatte genau dieses Problem - ich wollte, dass die auf x.example.local erstellten Sitzungswerte für example.local und umgekehrt verfügbar sind.

Alle Lösungen, bei denen ich fand, sagten, dass sie die Session-Domäne mit php_value session.cookie_domain .example.local in .htaccess (oder über php.ini oder ini_set) ändern. 

Der Haken war, dass ich den session.cookie_domain für alle Subdomains (soweit in Ordnung) aber auch für die Hauptdomain gesetzt habe. Das Festlegen von session.cookie_domain in der Hauptdomäne ist anscheinend ein Nein.

Im Grunde so, wie es für mich funktioniert hat: 

  • setze den session.cookie_domain für ALL SUBDOMAINS.
  • nicht für den Hauptdomain einstellen  

Ach ja, bitte stellen Sie sicher, dass die Domain eine TLD hat (in meinem Fall .local). Das HTTP-Protokoll erlaubt keine Speicherung von Cookies/Sitzungen in einer Domäne ohne .tld (dh localhost funktioniert nicht, aber stuff.localhost).

EDIT: Stellen Sie außerdem sicher, dass Sie Ihre Browser-Cookies löschen, wenn Sie Sitzungen über Subdomains testen/debuggen. Wenn Sie dies nicht tun, sendet Ihr Browser immer das alte Session-Cookie, für das wahrscheinlich noch nicht die korrekte cookie_domain festgelegt wurde. Der Server wird die alte Sitzung wiederbeleben. Daher werden falsche Ergebnisse angezeigt. (In vielen Beiträgen wird erwähnt, dass session_name ('stuff') für genau denselben Effekt verwendet wird.)

4
Valentin Florea

Ich habe es so gelöst

ini_set('session.cookie_domain', '.testdomain.dev');
session_start();

Weil ich an localhost gearbeitet habe 

ini_set('session.cookie_domain', '.localhost');

funktionierte nicht , er sieht .localhost als die oberste Ebene anstelle von .com/.local/... (ich vermute)

Ich habe auch .dev verwendet, weil die Arbeit mit OS X .com nicht als erstes in HOSTS zu lösen scheint

3
xtds

Ich habe bestätigt. Die Antwort von joreon ist richtig. Ich kann nicht kommentieren, da mein Ruf nicht ausreicht, deshalb poste ich meinen Kommentar hier.

Definieren Sie die Konstante in einer Konfigurationsdatei. Wenn Sie es ändern möchten, müssen Sie keine ganzen Dateien ändern.

define('ROOT_DOMAIN',   'mysite.com');
define('PHP_SESSION_NAME', 'MYSITE'); 

Der Sitzungsname darf nicht nur aus Ziffern bestehen, mindestens ein Buchstabe muss vorhanden sein. Andernfalls wird jedes Mal eine neue Sitzungs-ID generiert.

Verwenden Sie den folgenden Code, um die Sitzung zu starten

session_name(PHP_SESSION_NAME);
session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
session_start();

Ich verwende diese Funktion:

function load_session() {
    if (session_status() == PHP_SESSION_NONE) {
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    }
    else {
        if (session_name() != PHP_SESSION_NAME) {
            session_destroy();
            session_name(PHP_SESSION_NAME);
            session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
            session_start();
        }
    }
}
load_session(); // put it in anywhere you want to use session
2
Terry Lin

Verwenden Sie es in jeder Domain/Subdomain:

session_name('name');
ini_set('session.cookie_domain', '.example.com');
ini_set('session.save_path', '/var/lib/php/session');
session_start();

Der Pfad für session.save_path kann für Ihren Fall unterschiedlich sein, er sollte jedoch auf jeder Domain/Subdomain same sein. Dies ist standardmäßig nicht immer der Fall.

2
Nobody Tells

Verwenden Sie dies, es funktioniert: 

ini_set('session.cookie_domain', 
    substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
1
Ivan

Unterdomäne und Stammdomäne Cookie Sessions Kombinierte Verwendung

Ressource: http://php.net//manual/tr/function.session-set-cookie-params.php

Ich habe Werke getestet

sub.exampledomain.com/sessionadd.php?id=123

exampledomain.com/sessionview.php // 123

- Codes

<?php 
$currentCookieParams = session_get_cookie_params(); 

$rootDomain = '.example.com'; 

session_set_cookie_params( 
    $currentCookieParams["lifetime"], 
    $currentCookieParams["path"], 
    $rootDomain, 
    $currentCookieParams["secure"], 
    $currentCookieParams["httponly"] 
); 

session_name('mysessionname'); 
session_start(); 

setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain); 
?>
1
Limitless isa

Ich habe alle Antworten oben gelesen, ich denke, meine Antwort ist hilfreich für Leute, die dies googeln.

* Vergewissern Sie sich, dass die Browser Sitzungscookies an Server (von Domänen und Subdomänen) zurücksenden. Setzen Sie die Sitzungscookiedomäne auf ".example.com".

* Stellen Sie sicher, dass PHP das richtige "Ziel" zum Wiederherstellen der Sitzungsvariable findet - Wenn Domäne und Subdomains auf denselben Computer zeigen (möglicherweise auf andere virtuelle Hosts), stellen Sie sicher, dass "session_save_path" für alle gleich ist (I getestet) - Wenn Domäne und Subdomänen auf verschiedene Computer verweisen, eignet sich der gemeinsame Speicher (z. B. Datenbank) am besten zum Speichern und Wiederherstellen von Sitzungsdaten (ich habe noch nicht getestet). Verwenden Sie dazu "session_set_save_handler".

0
user953985

Ich habe die Idee, dass Sie nicht so etwas wie OpenID wollen, wie Joel vorschlägt, sondern dass Sie Zugriff auf die Sitzungsdaten in mehreren Domänen haben möchten.

Die einzige Möglichkeit, die ich mir als Lösung für dieses Problem vorstellen kann, besteht darin, die Sitzungsdaten in einer Datenbank zu speichern und aus dieser Datenbank abzurufen.

0
Thomas

Ich weiß, das ist alt, aber das funktioniert gut für mich mit mehreren Domains und Sub-Domains auf derselben Box.

<?php
define('site_domain','domain.com');
session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');

function _open(){

    global $_sess_db;

$db_user = 'user';
$db_pass = 'pass';
$db_Host = 'localhost';

if ($_sess_db = mysql_connect($db_Host, $db_user, $db_pass)){

    return mysql_select_db('database', $_sess_db);

}

return false;

}

function _close(){

    global $_sess_db;
    return mysql_close($_sess_db);

}

function _read($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "SELECT data
    FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

     if ($result = mysql_query($sql, $_sess_db)){

         if (mysql_num_rows($result)){
             $record = mysql_fetch_assoc($result);
             return $record['data'];
        }

    }

    return '';

}

function _write($id, $data){

    global $_sess_db;
    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "REPLACE INTO sessions
    VALUES ('$id', '$access', '$data', '$domain', '$agent')";

    return mysql_query($sql, $_sess_db);

}

function _destroy($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

function _clean($max){

    global $_sess_db;
    $old = time() - $max;
    $old = mysql_real_escape_string($old);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE  access < '$old' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

?>

0
Ian

Ich hatte ein ähnliches Problem, jedoch war diese Lösung gut für mich, vielleicht hilft sie in Zukunft anderen

bearbeiten Sie die php.ini

session.cookie_domain = ".example.com"

die Magie ist hier

suhosin.session.cryptdocroot = Off

suhosin.cookie.cryptdocroot = Off

https://www.sitepoint.com/community/t/sessions-across-subdomains-domain-com-phpsessid-changes/3013/19

0
Willian Santana

Versuchen Sie einfach, den folgenden Code über der session_start()-Methode zu verwenden

$sess_life_time = 21600; //in seconds
$sess_path = "/";
$sess_domain = ".you-site-name.com";
$sess_secure = true; // if you have secured session
$sess_httponly = true; // httponly flag

session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);
0
mohsin.mr

Ich kann nicht für andere PHP-Versionen sprechen, aber in 5.6.6 hat das einfache Einstellen des session.cookie_domain-Werts in der php.ini-Datei den Trick bewirkt, dass alle meine Subdomains auf iPage denselben Satz von Sitzungsvariablen gemeinsam nutzen können. 

Entfernen Sie zum Testen alle vorhandenen Cookies, die sich auf Ihre Domain beziehen, aus Ihrem Browser. 

session.cookie_domain = '.yourdomainname.org'

Ich weiß nicht, ob es einen Unterschied macht, aber ich verwende auch den Autostart der Sitzung. 

session.auto_start = 1
0
user3232196