Разрешить сеансам php переносить на поддомены

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

Есть ли способ принимать сеансы из всех доменов, пока их * .mydomain.com

Вот 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 
  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'); 

безопасность будет проклята, если вы так расстроены неполными или плохими ответами, как я, это ваш спаситель. Это просто работает.

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

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

Надеюсь, это поможет (мне потребовались годы, чтобы понять это).

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

  session_name('mysession'); 

затем используйте следующий код на странице php

  session_set_cookie_params(0,"/",".example.com",FALSE,FALSE); setcookie(session_name(), session_id(),0,"/","example.com"); session_start(); то значение  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 вашего браузера, просто удалите все куки домена и поддомена и повторите процесс.

Другой вариант, который работал для меня: это принудительное имя сеанса:

 session_name("myWebsite"); session_start(); 

да. Работает ini_set . но не забудьте уничтожить все кеши и файлы cookie браузера, чтобы увидеть, как он работает.

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

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

У меня была эта проблема, и оказалось, что я использую разные файлы php.ini для двух разных поддоменов. Эти ini-файлы задавали разные переменные session.save_path . По очевидным причинам это должно быть одинаковым для всех поддоменов, которым необходимо обмениваться сеансами.

 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()