2009-03-13 11 views
59

Uso las sesiones php (no las cookies, excepto la cookie id de sesión) para todos los datos de usuario, y cuando un usuario va a su perfil user.mydomain.com inmediatamente se "desconectan" hasta entonces, elimina el subdominio.Permitir que las sesiones php se transfieran a los subdominios

¿Hay una manera de aceptar las sesiones de todos los dominios, siempre y cuando sus * .midominio.com

+0

En primer lugar, 'ini_set ('session.cookie_domain', '.example.com')', '* * entonces session_start()' 'Sesión o :: Start()' de https://github.com/delight-im/PHP-Cookie – caw

Respuesta

74

Aquí hay 4 opciones.

colocar esto en su php.ini:

session.cookie_domain = ".example.com" 

o en su .htaccess:

php_value session.cookie_domain .example.com 

O como la primera cosa en su script:

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

O en su configuración de grupo php-fpm para su sitio:

php_value[session.cookie_domain] = .example.com 
+2

Desafortunadamente las 3 no funcionó, ¿tiene que haber una estrella *? – Anthony

+2

Muy extraño, he usado esos métodos antes y funcionan bien. ¿Por casualidad has instalado Suhosin, recuerdo que debe haber un ajuste que deba cambiarse para permitir esto? Si no lo hace, ¿puede publicar más información sobre su instalación (por ejemplo, apache, lighttpd, versión de php)? – CTT

+0

algunos paquetes vienen con Suhosin en él. 'php -i | grep -i 'Suhosin'' para ver si está allí –

11
 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'); 

security maldito sea, si está tan frustrado con respuestas incompletas o malas como yo, este es su salvador. Simplemente funciona.

+0

esto funcionó para mí, pero no entiendo el problema de seguridad. ¿Te importaría explicar qué problemas de seguridad podrían estar allí? – Neo

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

Esta es una buena solución, pero no puede usarla en todas las situaciones. Por ejemplo, no funcionará cuando no pueda confiar en las cookies que no son de sesión.

Esto realmente DEBE funcionar si lo usa correctamente.

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

Por ejemplo, usted necesita para ponerlo antes session_start() y también en todos los archivos que requieren session_start()

4

Sé que esto es bastante viejo - pero para ampliar aún más el @ sugerencia de CTT - que tenía que añadir un php archivo .ini en cada sub-directorio (que se ejecuta el código php y requiere la sesión) de mi subdominio con el siguiente texto:

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

espero que esto ayuda (me tomó las edades de esta cifra).

+0

Este es el mal, ha estado depurando durante 2 horas, ya que el intercambio de sesiones ha estado funcionando bien en mi entorno local. debería haber comprobado suhosin configuración anterior – weyandch

2

Otra opción que funcionó para mí: es forzar el nombre de la sesión:

session_name("myWebsite"); 
session_start(); 
0

simplemente he tenido este problema y resulta que yo estaba usando diferentes archivos php.ini por dos diferentes subdominios . Estos archivos ini especificaron diferentes variables session.save_path. Por razones obvias, esto tiene que ser el mismo para todos los subdominios que necesitan compartir sesiones.

5

cambio el nombre de sesión en la parte superior de las funciones básicas archivo como

session_name('mysession'); 

continuación, utilizar el siguiente código en la página php

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

finalmente cambiar el nombre predeterminado de la sesión del subdominio y elimine la cookie predeterminada en el archivo de funciones principales del subdominio como:

/*default session name*/ 
session_name("mysession"); 
/*remove the PHPSESSID and default session name from subdomain's cookie*/ 
setcookie("mysession", "",1,"/"); 
setcookie("PHPSESSID", "",1,"/"); 

si continúa con el uso del nombre de la cookie como PHPSESSID, simplemente quitar todas las funciones con

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

a continuación, comprobar las cookies existentes de su navegador, simplemente eliminar todas las cookies de dominio y subdominio, y repetir el proceso.

+0

Esto hizo el trabajo para mí. Ninguna de las otras respuestas en esta pregunta funcionó. –

2

sí. ini_set está trabajando. pero recuerda destruir todos los cachés y cookies del navegador para ver si funciona.

  1. destruir todas las memorias caché y cookies de su navegador
  2. en su xxx.example.com y yyy.example.com, sus archivos php deben empezar así.

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