2009-03-13 16 views
59

Io uso le sessioni php (non i cookie, ad eccezione del cookie ID sessione) per tutti i dati utente e quando un utente accede al proprio profilo utente.miodominio.com vengono immediatamente "disconnessi" fino ad allora rimuovere il sottodominio.Consentire alle sessioni di php di trasferire ai sottodomini

Esiste un modo per accettare sessioni da tutti i domini più a lungo le sue * .mydomain.com

+0

In primo luogo, 'ini_set ('session.cookie_domain', '.example.com')', * poi * 'session_start()' o 'Session :: Start()' da https://github.com/delight-im/PHP-Cookie – caw

risposta

74

Qui ci sono 4 opzioni.

Posto questo nel vostro php.ini:

session.cookie_domain = ".example.com" 

o nel vostro .htaccess:

php_value session.cookie_domain .example.com 

O come la prima cosa che nello script:

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

O in la configurazione del tuo pool php-fpm per il tuo sito:

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

Sfortunatamente tutti e 3 non hanno funzionato, ci deve essere una stella *? – Anthony

+2

Molto strano, ho usato quei metodi prima e funzionano bene. Per caso hai installato Suhosin, ricordo che c'era un'ambientazione che doveva essere cambiata per consentire questo? Se non lo fai, puoi pubblicare maggiori informazioni sulla tua installazione (ad esempio apache, lighttpd, versione php)? – CTT

+0

alcuni pacchetti vengono forniti con Suhosin. 'php -i | grep -i 'Suhosin'' per vedere se è lì –

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

sicurezza essere dannato, se sei frustrato con risposte incomplete o cattive come sono, questo è il tuo salvatore. Funziona e basta.

+0

questo ha funzionato per me, ma non capisco il problema di sicurezza. Ti dispiacerebbe spiegare quali potrebbero essere i problemi di sicurezza? – 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'); 

Questa è una buona soluzione, ma non è possibile utilizzarla in tutte le situazioni. Ad esempio, non funzionerà quando non puoi fare affidamento sui cookie non di sessione.

Questo in realtà DEVE funzionare se lo si utilizza correttamente.

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

Per esempio è necessario mettere prima session_start() e anche in tutti i file che chiamano session_start()

4

So che questo è abbastanza vecchio - ma per espandere ulteriormente il @ suggerimento di CTT - avevo bisogno di aggiungere un php file ini in ogni sotto-directory (che sarà in esecuzione il codice php e richiede la sessione) del mio sottodominio con il seguente testo:

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

Spero che questo aiuta (mi ci sono voluti secoli per capire questo).

+0

Questo è malvagio, è stato eseguito il debug per 2 ore, dato che la condivisione delle sessioni ha funzionato bene sul mio ambiente locale. dovrebbe aver controllato le impostazioni suhosin in precedenza – weyandch

2

Un'altra opzione che ha funzionato per me: è quello di forzare il nome della sessione:

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

Ho appena avuto questo problema e si scopre che stavo usando diversi file php.ini per due diversi sottodomini . Questi file ini hanno specificato diverse variabili session.save_path. Per ovvi motivi, questo deve essere lo stesso per tutti i sottodomini che devono condividere sessioni.

5

cambiamento il nome della sessione in cima alle funzioni di base di file come

session_name('mysession'); 

quindi utilizzare il seguente codice nella pagina php

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

finalmente cambiare il nome della sessione di default del sottodominio e rimuovere il cookie predefinito nel file delle funzioni principali del sottodominio come:

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

se si continua con utilizzando il tuo nome cookie come PHPSESSID, è sufficiente rimuovere tutte le funzioni con

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

quindi controllare i cookie esistenti del browser, è sufficiente rimuovere tutti i cookie di dominio e sottodominio, e ripetere il processo.

+0

Questo ha fatto il lavoro per me. Nessuna delle altre risposte in questa domanda ha funzionato. –

2

sì. ini_set funziona. ma ricorda di distruggere tutte le cache e i cookie del browser per vederlo funzionare.

  1. distruggere tutte le cache ei cookie del tuo browser
  2. nel vostro xxx.example.com e yyy.example.com, i file PHP dovrebbe iniziare in questo modo.

    ini_set('session.cookie_domain', '.example.com'); session_start(); 
    
Problemi correlati