Дозволити php-сесіям переноситися на субдомени


75

Я використовую php-сесії (не cookie-файли, за винятком cookie-файлу ідентифікатора сесії) для всіх даних користувача, і коли користувач переходить до свого профілю user.mydomain.com, вони негайно "виходять з системи", поки не видаляють субдомен.

Чи є спосіб прийняти сеанси з усіх доменів, якщо його * .mydomain.com


1
По- перше, ini_set('session.cookie_domain', '.example.com'), а потім session_start() і Session::start()від github.com/delight-im/PHP-Cookie
каркати

Відповіді:


94

Ось 4 варіанти.

Помістіть це у свій php.ini:

session.cookie_domain = ".example.com"

Або у вашому .htaccess:

php_value session.cookie_domain .example.com

Або як перше, що є у вашому сценарії:

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

Або у конфігурації пулу php-fpm для вашого сайту:

php_value[session.cookie_domain] = .example.com

2
На жаль, всі 3 не спрацювали, чи повинна бути зірка *?
Ентоні

2
Дуже дивно, я використовував ці методи раніше, і вони працюють нормально. Ви випадково встановили Сухосін, я пам’ятаю, було якесь налаштування, яке потрібно було змінити, щоб дозволити це? Якщо цього не сталося, чи можете ви розмістити більше інформації про свою установку (наприклад, apache, lighttpd, php версія)?
CTT

4
@CTT, будь ласка, додайте четверту опцію до своєї відповіді: session_set_cookie_params(0, '/', 'example.com', false, false);
Sacred Socks

7
Не забудьте фактично закрити браузер, а потім відкрити його знову. Інакше ви збираєтеся ходити по колу! .. я зробив
AndrewC

9
Ще одне нагадування для таких німих, як я: переконайтеся, що ini_set('session.cookie_domain', '.example.com');прийшли раніше session_start();
Ben Y

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

безпека хай буде проклята, якщо ви розчаровані неповними або поганими відповідями, як і я, це ваш рятівник. Це просто працює.


3
це спрацювало для мене, але я не розумію проблеми безпеки. Не могли б ви пояснити, які проблеми безпеки можуть бути там?
Neo,

6

змінити назву сеансу у верхній частині файлу основних функцій, наприклад

 session_name('mysession');

потім використайте наступний код на php-сторінці

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

нарешті, змініть назву сеансу за замовчуванням піддомену та видаліть файл cookie за замовчуванням у файлі основних функцій піддомену, наприклад:

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

якщо ви продовжуєте використовувати назву свого файлу cookie як PHPSESSID, просто видаліть усі функції за допомогою

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

потім перевірте наявні файли cookie вашого браузера, просто видаліть усі файли cookie домену та субдомену та повторіть процес.


Це зробило роботу для мене. Жодна з інших відповідей у ​​цьому питанні не спрацювала.
Art Geigel

4

Я знаю, що це досить давно - але для подальшого розширення пропозиції @ CTT - мені потрібно було додати файл php.ini у кожен підкаталог (який буде виконувати php-код і вимагатиме сеансу) мого субдомену з наступним текстом:

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

Сподіваюся, це допоможе (мені потрібні були віки, щоб це зрозуміти).


Цей є злим, налагоджував вже 2 години, оскільки обмін сесіями чудово працює у моєму локальному середовищі. слід було перевірити налаштування
сухосіна

4

Ще один варіант, який працював для мене: це примусити назву сесії:

session_name("myWebsite");
session_start(); 

1
Це здається найпростішим рішенням
Адам,

3

так. ini_setпрацює. але не забудьте знищити всі кеші та файли cookie браузера, щоб побачити, як він працює.

  1. знищити всі кеші та файли cookie вашого браузера
  2. у вашому xxx.example.comі yyy.example.com, ваші php-файли повинні починатися так.

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

0

У мене щойно виникла ця проблема, і виявляється, я використовував різні файли php.ini для двох різних субдоменів. Ці файли ini визначають різні змінні session.save_path . З очевидних причин це повинно бути однаковим для всіх субдоменів, яким потрібно спільно використовувати сесії.


0

Спробуйте це:

session_start(); 

$sessionId =  session_id();

зареєстрував користувача. Коли користувач переключиться на інший субдомен, надісланий ідентифікатор сеансу в URL-адресі, як цеuser.mydomain.com/?id=$sessionId

$sessionId =  $_GET['id'];

session_start($sessionId); 

Тепер користувач отримає всі значення сеансу та залишиться в системі.


6
Якщо ваша відповідь починається з "спробуй це", ти робиш це неправильно.
Джей Бланшар,

0

Перш ніж session_start()використовувати session_set_cookie_params()заміну .domain.com на ваш домен, як у цьому прикладі:

session_set_cookie_params(0, '/', '.domain.com');
session_start();

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

Це хороше рішення, але використовувати його можна не у всіх ситуаціях. Наприклад, це не спрацює, коли ви не можете покладатися на несесійні файли cookie.

Це насправді ПОВИННО працювати, якщо ви використовуєте його правильно.

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

Наприклад, вам потрібно розмістити його перед, session_start()а також у всіх файлах, які викликаютьsession_start()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.