2012-02-16 16 views
5

He intentado mantener valores de sesión entre dos subdominios y me pareció imposible. Terminé la creación de 2 páginas web PHP mínimos como un banco de pruebas, uno que llamo 'prueba 1' sólo estableceMantenimiento de variables de sesión en subdominios

$_SESSION['test'] = "Fred"; 

y tiene un hipervínculo a 'prueba de 2', que simplemente trata de eco del valor de $ _SESSION [ 'prueba'] para demostrar que funcionó, o no. Pongo 'prueba 1' en mi dominio www y 'prueba 2' en mi subdominio. Intento varias versiones de lo que debería ir en el encabezado, de varias fuentes. Estas son las principales 3 (y por supuesto sus variantes):

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

o

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

o

ini_set('session.cookie_domain', PHP_INI_ALL); 
session_start(); 

o

session_set_cookie_params(0, "/", ".mydomain.com", false); 
session_start(); 

Me parece que tengo una resultado idéntico en todos los casos. La sesión no se transmite a través de los subdominios y la prueba de página 2 no tiene idea de a qué valor configuré $ _SESSION ['test']. Sin embargo, parece que hay mucha certeza en torno a la red de que uno de los métodos anteriores debería funcionar. ¿Alguna idea de lo que podría estar pasando, sobre todo porque estoy usando páginas mínimas para probar el mecanismo (sin efectos secundarios que puedo ver)? Por cierto, estoy en un servidor compartido, si es pertinente aquí.

Gracias por su opinión. Franco.

Editar. Lo arreglé. El problema fue causado por Suhosin. Ver respuesta detallada al pie de esta página.

Respuesta

5

autorización I clavado y era un apestoso.

La opción Suhosin suhosin.session.cryptdocroot fue la causa completa del problema. Cuando la clave de cifrado de la sesión se basa en DocRoot, hace que los subdominios no puedan ver las variables de sesión de los demás cuando el dominio base y los subdominios se sirven desde directorios diferentes. Esto lleva a los valores de sesión en el servidor almacenados en diferentes carpetas y, por lo tanto, no son visibles para cada uno de los dominios correspondientes.

Solución. Basta con añadir estas 2 líneas en su archivo php.ini:

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

Una pesadilla 48 horas de rastrear, 4,8 segundos para arreglar.

+0

"Una pesadilla de 48 horas para rastrear, 4,8 segundos para arreglar" - super. Te entiendo :) – qasanov

0

que tienen que trabajar, el establecimiento de un nombre de sesión y la cookie de sesión parámetros:

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

Gracias. Intenté nombrar la sesión, sin alegría. Ahora tengo más información. Probé una prueba sugerida en la documentación en php.net y agregué lo siguiente: $ nombre_de_veres = nombre_de_sesión ("nombre_algunas"); $ blnResult = ini_set ("session.cookie_domain", ".midominio.com"); session_start(); if (vacío ($ blnResult) o (! $ blnResult)) {echo "no se puede establecer la configuración"; salida; } ¡Encuentro que el resultado de la devolución dice que no se está configurando! ¿Alguna idea de por qué debería ser? – Frankie

+0

@Frank Anderson No he probado el método 'ini_set', solo el' session_set_cookie_params'. – jeroen

+0

Gracias jeroen. Cometí un error torpe pero ahora lo corregí y sí, ahora he usado la configuración exactamente como sugieres aquí.Sin embargo, el valor de la Var de la sesión no se transfiere a la página de "recepción", siempre que esté en un subdominio. ¿Qué otra cosa podría ser, o qué otros diagnósticos podría tratar de tratar de averiguar qué está pasando? – Frankie

Cuestiones relacionadas