Я использую 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 браузера, чтобы увидеть, как он работает.
на вашем 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()