Ведение переменных сеанса в поддоменах - PullRequest
5 голосов
/ 16 февраля 2012

Я пытался сохранить сеансовые переменные между двумя поддоменами и нашел это невозможным. В итоге я создал 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. Смотрите подробный ответ в нижней части этой страницы.

Ответы [ 2 ]

5 голосов
/ 18 февраля 2012

Хорошо, я прибил это, и это было мерзко.

Причиной проблемы был параметр suhosin.session.cryptdocroot.Когда ключ шифрования сеанса основан на DocRoot, это приводит к тому, что субдомены не могут видеть переменные сеанса друг друга, когда базовый домен и субдомены обслуживаются из разных каталогов.Это приводит к тому, что переменные сеанса на сервере хранятся в разных папках и, следовательно, они не видны для каждого из соответствующих доменов.

Решение.Просто добавьте эти две строки в ваш файл php.ini:

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

Кошмарный 48-часовой кошмар, чтобы выследить, 4,8 секунды, чтобы исправить.

0 голосов
/ 16 февраля 2012

У меня все работает, задаю имя сеанса и параметры cookie сеанса:

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.some_domain.com');
session_start();
...