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]
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.
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
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.
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:
session.cookie_domain
für ALL SUBDOMAINS. 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.)
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
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
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.
Verwenden Sie dies, es funktioniert:
ini_set('session.cookie_domain',
substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
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);
?>
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".
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.
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);
}
?>
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
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);
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