2009-03-13 11 views
59

Używam sesji php (nie ciasteczek, z wyjątkiem pliku cookie sesji) dla wszystkich danych użytkownika, a kiedy użytkownik odwiedza ich profil user.mydomain.com, są oni natychmiast "wylogowani" aż do usunięcia poddomeny.Zezwalaj na przenoszenie sesji php do subdomen

Czy istnieje sposób, aby zaakceptować sesje ze wszystkich dziedzin jak długo jego * .mojadomena.com

+0

Najpierw 'ini_set ('session.cookie_domain', '.example.com')', '* potem * session_start()' lub 'Sesja :: start()' od https://github.com/delight-im/PHP-Cookie – caw

Odpowiedz

74

Oto 4 opcji.

Place to w php.ini:

session.cookie_domain = ".example.com" 

lub w .htaccess:

php_value session.cookie_domain .example.com 

Albo jako pierwszą rzeczą w skrypcie:

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

albo w konfiguracja puli php-fpm dla Twojej witryny:

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

Niestety wszystkie trzy nie działały, czy musi być gwiazda *? – Anthony

+2

Bardzo dziwne, użyłem tych metod wcześniej i działają dobrze. Czy przypadkiem masz zainstalowanego Suhosin, pamiętam, że było ustawienie, które musiało zostać zmienione, aby to umożliwić? Jeśli nie, możesz zamieścić więcej informacji na temat swojej instalacji (np. Apache, lighttpd, wersja php)? – CTT

+0

niektóre pakiety są dołączone do Suhosin. 'php -i | grep -i 'Suhosin'', aby sprawdzić, czy jest tam –

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

Bezpieczeństwo się potępi, jeśli jesteś tak sfrustrowany niezupełnymi czy złymi odpowiedziami jak ja, to twój wybawca. Po prostu działa.

+0

to działało dla mnie, ale nie rozumiem kwestii bezpieczeństwa. Czy mógłbyś wyjaśnić, jakie mogą być problemy z bezpieczeństwem? – 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'); 

Jest to dobre rozwiązanie, ale nie można go używać we wszystkich sytuacjach. Na przykład nie zadziała, gdy nie będziesz mógł polegać na ciasteczkach niesesyjnych.

To faktycznie musi działać, jeśli używasz go poprawnie.

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

Na przykład trzeba umieścić go przed session_start() a także we wszystkich plikach, które wymagają session_start()

4

Wiem, że to dość stary - ale do dalszego rozwoju na @ sugestią CTT za - Musiałem dodać php plik .ini w każdym podkatalogu (które będą wykonywanie kodu pHP i wymaga sesję) mojego subdomeny z następującym tekstem:

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

mam nadzieję, że to pomoże (zajęło mi wieki, aby dowiedzieć się tego).

+0

To jest złe, debugowałem przez 2 godziny, ponieważ udostępnianie sesji działa dobrze na moim lokalnym środowisku. powinien wcześniej sprawdzić ustawienia suhosin – weyandch

2

Inną opcją, która pracowała dla mnie jest, aby wymusić nazwę sesji:

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

prostu miałem ten problem i okazuje się, używałem różnych plików php.ini dla dwóch różnych subdomen . Te pliki ini określiły różne zmienne session.save_path. Z oczywistych powodów musi to być takie samo dla wszystkich subdomen, które muszą udostępniać sesje.

5

zmiana nazwy sesja na szczycie podstawowych funkcji złożyć jak

session_name('mysession'); 

następnie użyć następującego kodu do strony php

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

wreszcie zmienić domyślną nazwę sesji subdomenie i usuń domyślny plik cookie w głównym pliku poddomeny: , taki jak:

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

jeśli kontynuować przy użyciu nazwy plików cookie jako PHPSESSID, po prostu usunąć wszystkie funkcje z

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

następnie sprawdzić w przeglądarce istniejące pliki cookie, po prostu usunąć wszystkie pliki cookie z domeny i subdomeny, i powtórzyć proces.

+0

To zrobiło to za mnie. Żadna z innych odpowiedzi w tym pytaniu nie zadziałała. –

2

tak. ini_set działa. ale pamiętaj, aby zniszczyć wszystkie pamięci podręczne i pliki cookie przeglądarki, aby przekonać się, że działa.

  1. zniszczyć wszystkie pamięci podręcznej i plików cookie swojej przeglądarki
  2. w swojej xxx.example.com i yyy.example.com, pliki php powinien zacząć w ten sposób.

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