2012-02-16 2 views
5

Я пытался поддерживать сеансовые вары между двумя подобластями и считал это невозможным. Я в конечном итоге создать 2 минимальные PHP вебов-страниц в качестве испытательного стенда, один я называю «тест-1» просто устанавливаетВедение переменных сеанса по субдоменам

$_SESSION['test'] = "Fred"; 

и имеет гиперссылка на «тест 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']. Тем не менее, по всей видимости, существует много уверенности в том, что один из вышеперечисленных методов должен работать. Любая идея, что может происходить, тем более, что я использую минимальные страницы для проверки механизма (никаких побочных эффектов, которые я могу видеть)? Кстати, я на общем сервере, если это уместно.

Благодарим вас за мысли. Фрэнк.

Редактировать. Я исправил его. Проблема была вызвана Сухосиным. См. Подробный ответ в нижней части этой страницы.

ответ

5

Хорошо, я прибил его, и это было стерва.

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

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

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

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

+0

«48-часовой кошмар для отслеживания, 4,8 секунды, чтобы исправить» - супер. Я понимаю тебя :) – qasanov

0

У меня он работает, устанавливая имя сеанса и куки сессии параметры:

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

Спасибо. Я попробовал назвать сессию - нет радости. У меня теперь есть больше информации. Я попробовал тест, предложенный в документации на php.net, и добавил следующее: $ some_name = session_name ("some_name"); $ blnResult = ini_set ("session.cookie_domain", ".mydomain.com"); session_start(); if (empty ($ blnResult) или (! $ blnResult)) {настройка echo "не может быть установлена"; Выход; } Я считаю, что результат возврата говорит, что он не устанавливается! Любая идея, почему это должно быть? – Frankie

+0

@Frank Anderson Я не пробовал метод 'ini_set', просто' session_set_cookie_params'. – jeroen

+0

Спасибо, jeroen. Я сделал неуклюжую ошибку, которую вижу, но теперь я исправил это, и да, я теперь использовал настройки точно так же, как вы предлагаете здесь.Тем не менее значение Session Var не переносится на страницу «получение», если она находится в субдомене. Что еще это может быть, или какие другие методы диагностики я могу попытаться выяснить, что происходит? – Frankie

Смежные вопросы