Sesiones PHP en subdominios

Estoy tratando de configurar lo siguiente:

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

donde si el usuario visita sub1.domain.com o sub2.domain.com y no están conectados, se les envía a auth.domain.com y pueden iniciar sesión. sub1.domain.com y sub2.domain.com son dos aplicaciones separadas pero usan las mismas credenciales.

Intenté configurar lo siguiente en mi php.ini:

 session.cookie_domain = ".domain.com" 

pero no parece estar pasando la información de un dominio a otro.

[Editar]

Intenté lo siguiente:

sub1.domain.com/test.php

 session_set_cookie_params(0, '/', '.domain.com'); session_start(); print session_id() . "
"; $_SESSION['Regsitered'] = 1; echo 'Change Sites'

auth.domain.com/test.php

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

Los ID de sesión son exactamente los mismos, pero cuando elimino la variable $ _SESSION, no se muestran ambas claves, cualquiera que sea la clave que establezca en cada dominio.

[Editar 2]

Actualicé [Editar]

No sé si el problema persiste, pero me encontré con el mismo problema y lo solucioné estableciendo un nombre de sesión antes de llamar a session_set_cookie_params ():

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

No he cambiado nada en mi php.ini pero ahora todo está funcionando bien.

Una cosa que puede impedir misteriosamente que los datos de la sesión se lean en un subdominio, a pesar de que las cookies se establezcan correctamente en .domain.com es el parche PHP Suhosin. Puede tener todo configurado correctamente, según los ejemplos en la pregunta, y simplemente no puede funcionar.

Desactiva la siguiente configuración de sesión de Suhosin y vuelves a estar en el negocio:

 suhosin.session.cryptua = Off suhosin.session.cryptdocroot = Off 

Intenta usar:

 session.cookie_domain = "domain.com" 

En lugar de:

 session.cookie_domain = ".domain.com" 

Tenga en cuenta el período faltante.

Tenga cuidado al usar esto, sin embargo, porque no es compatible con todos los navegadores.

Lo solucioné así

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

Porque estaba trabajando en localhost

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

no funcionaba , ve .localhost como el toplevel en lugar de .com / .local / … (sospecho)

También utilicé .dev porque trabajar en OS X no parece resolver .com como el primero en HOSTS

Tenía este problema exacto: quería que los valores de sesión creados en x.example.local estuvieran disponibles en example.local y viceversa.

Todas las soluciones que encontré dijeron cambiar el dominio de sesión usando php_value session.cookie_domain .example.local en .htaccess (o vía php.ini o vía ini_set).

El problema era que estaba configurando el dominio session.cookie_domain para todos los subdominios (hasta ahora está bien) pero también para el dominio principal. La configuración de session.cookie_domain en el dominio principal es aparentemente un no-no.

Básicamente, la forma en que funcionó para mí:

  • establezca session.cookie_domain para TODOS LOS SUBDOMINIOS.
  • no lo configure para el DOMINIO principal

Oh, sí, asegúrese de que el dominio tenga un TLD (en mi caso .local). El protocolo Http no permite que las cookies / sesiones se almacenen en un dominio sin .tld (es decir, localhost no funcionará, pero lo hará stuff.localhost).

EDITAR : También asegúrese de borrar siempre las cookies de su navegador mientras prueba / depura sesiones en subdominios. Si no lo hace, su navegador siempre enviará la cookie de sesión anterior que probablemente aún no tenga el cookie_domain correcto establecido. El servidor revivirá la sesión anterior y, por lo tanto, obtendrá resultados negativos falsos. (en muchas publicaciones se menciona que use session_name (‘cosas’) para el mismo efecto exacto)

Úselo en cada dominio / subdominio:

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

La ruta de session.save_path puede ser diferente para su caso, pero debería ser la misma en cada dominio / subdominio. No es siempre cierto por defecto.

He confirmado. La respuesta de joreon es correcta. No puedo comentar porque mi reputación no es suficiente, así que publico mi comentario aquí.

Defina la constante en un archivo de configuración. Si desea cambiarlo, no es necesario modificar archivos completos.

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

El nombre de la sesión no puede consistir en dígitos solamente, al menos una letra debe estar presente. De lo contrario, se genera una nueva identificación de sesión cada vez.

Use el siguiente código para comenzar a usar la sesión

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

Estoy usando esta función:

 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 

Use esto, funciona:

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

Dominio secundario y dominio raíz Uso combinado de sesiones de cookies

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

He probado trabajos

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

– Códigos

 < ?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); ?> 

Me da la idea de que no quieres algo como OpenID, como sugiere Joel, sino que quieres tener acceso a los datos de la sesión en múltiples dominios.

La única posibilidad que se me ocurre como solución para ese problema es almacenar los datos de sesión en una base de datos y extraerlos de esa base de datos.

Sé que esto es viejo, pero esto funciona bien para mí con múltiples dominios y subdominios en el mismo cuadro.

 < ?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); } 

?>

He leído todas las respuestas anteriores, creo que mi respuesta es útil para las personas que buscan en Google esto.

* Asegúrese de que los navegadores envían la cookie de sesión a los servidores (de dominio y subdominios), establezca el dominio de la cookie de sesión como “.example.com”.

* Asegúrese de que php encuentre el “objective” correcto para restaurar la sesión var – Si el dominio y los subdominios apuntan a la misma máquina (quizás diferentes hosts virtuales), asegúrese de que “session_save_path” sea el mismo para todos (probé) – Si dominio y subdominios apunte a diferentes máquinas, el almacenamiento común (como la base de datos) es mejor para guardar y restaurar los datos de la sesión (aún no lo hice). Use “session_set_save_handler” para hacer eso.

Simplemente intente usar el siguiente código justo encima del método session_start()

 $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); 

Tenía un problema similar, sin embargo, esta solución fue buena para mí, tal vez ayudará a otros en el futuro

editar el php.ini

session.cookie_domain = “.example.com”

la magia está aquí

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

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

No puedo hablar de otras versiones de PHP, pero en 5.6.6, simplemente estableciendo el valor de session.cookie_domain en el archivo php.ini hice el truco para permitir que todos mis subdominios en iPage compartan el mismo conjunto de variables de sesión.

Asegúrese de eliminar cualquier cookie existente relacionada con su dominio de su navegador para probar.

 session.cookie_domain = '.yourdomainname.org' 

Oh, no sé si hace alguna diferencia, pero también estoy usando autostart de sesión.

 session.auto_start = 1 

Una solución rápida y sucia es usar esto para su redirección:

 header( $url.'?'.session_name().'='.session_id() ); 

esto agregará algo como “PHPSESSID = etnm7kbuf5lg0r6tv7je6ehtn4” a la URL, que indica a PHP el ID de sesión que debería usar.