Я пытался поддерживать сеансовые вары между двумя субдоменами и считал это невозможным. Я закончил создание 2 минимальных веб-страниц PHP в качестве тестовой кровати, которую я называю «тест 1», просто устанавливает
$_SESSION['test'] = "Fred";
и имеет гиперссылку на «test 2», которая просто пытается отозвать значение $ _SESSION ['test'], чтобы доказать, что он сработал, или нет. Я помещаю 'test 1' в свой домен www и 'test 2' в свой поддомен. Я пробую различную версию того, что должно быть в заголовке, из разных источников. Вот основные 3 (и, конечно же, их варианты):
ini_set('session.cookie_domain',substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); session_start();
или
ini_set('session.cookie_domain','mydomain.com'); session_start();
или
ini_set('session.cookie_domain', PHP_INI_ALL); session_start();
или
session_set_cookie_params(0, "/", ".mydomain.com", false); session_start();
Я нахожу, что получаю одинаковый результат в каждом случае. Сеанс не переносится через субдомены, а проверка страницы 2 не имеет представления о том, какое значение я устанавливаю $ _SESSION ['test']. Тем не менее, по всей видимости, существует много уверенности в том, что один из вышеперечисленных методов должен работать. Любая идея, что может происходить, тем более, что я использую минимальные страницы для проверки механизма (никаких побочных эффектов, которые я могу видеть)? Кстати, я на общем сервере, если это уместно.
Спасибо за ваши мысли. Фрэнк.
Изменить . Я починил это. Проблема была вызвана Сухосиным. См. Подробный ответ в нижней части этой страницы.
Хорошо, я прибил его, и это было грубой.
Suhosin's suhosin.session.cryptdocroot вариант был всей причиной проблемы. Когда ключ шифрования сеанса основан на DocRoot, он приводит к тому, что поддомены не могут видеть переменные сеанса друг друга, когда базовый домен и поддомены обслуживаются из разных каталогов. Это приводит к тому, что сеансовые вары на сервере хранятся в разных папках и, следовательно, они не видны для каждого из соответствующих доменов.
Решение. Просто добавьте эти 2 строки в файл php.ini:
suhosin.session.cryptdocroot=Off suhosin.cookie.cryptdocroot=Off
48-часовой кошмар для отслеживания, 4,8 секунды, чтобы исправить.
У меня он работает, устанавливая имя сеанса и параметры cookie сеанса:
$some_name = session_name("some_name"); session_set_cookie_params(0, '/', '.some_domain.com'); session_start();