Передача данных сессии между различными доменами

no_alex

Новичок
Передача данных сессии между различными доменами

Привет всем!

Возникла такая проблема: если сайт состоящий из нескольких субдоменов (зачем? - не спрашивайте: требование заказчика). Пользователь в процессе сёрфинга по сайту может многократно перепрыгивать-возвращаться с одного субдомена на другой. Мне, соответственно, надо "удерживать" одну и ту же сессию в процессе этого сёрфинга.
На платформе windows задача решилась сравнительно легко - для сессионных кук я указал, чтобы они были едины для всех субдоменов. В "особых" случаях принудительно передавал SID через GET.

Но когда я переложил проект на сервер под Linux - он работать перестал.

После того как я провел ряд экспериментов, я понял, что методы хранения данных в сессии на этих платформах различаются, несмотря на то что параметры в конфигурационных файлах у меня совпадают. На windows в файле сессии я вижу обычную сериализованную строку, а на Linux эти данные зашифрованы каким-то образом.

Как я уже упоминал, кофиги у меня одинаковые, но вот когда я сравниваю phpinfo на обоих серверах то вижу одно различие.
На windows:
Registered save handlers files user
На Linux:
Registered save handlers files user mm
Возможно в этом вся проблема (в мануалах я ничего не нашёл по этому поводу). Но вот как изменить мне эти значения я так и не понял. В конфигах у меня, там и там стоят:
session.save_handler = files

Для хостинга используется VPS, поэтому, если для решения этой задачи потребуется пересобрать PHP - проблем не будет.

Возможно я вообще "думаю не в ту сторону". Может у кого-то есть совершенно другое решение по данной проблеме?

-~{}~ 28.09.08 04:07:

Интересная особенность на Linux:
между доменами example.com и www.example.com сессия вышеназванным способом передается без проблем. А вот при попытке "перепрыгнуть" на домен otherdomain.example.com - данные сессии очищаются.
Явно видно что разработчики пытались, таким образом, обеспечить высокую надёжность при доступе к сессионным данным (т.е. недоступность с другого домена). Но можно ли мне как-то отключить эту опцию, и если нет, то как мне решить выше поставленную задачу?

P.S. Чисто из любопытства - почему подобный механизм не реализован под windows?
 

Фанат

oncle terrible
Команда форума
жесть

-~{}~ 28.09.08 10:23:

пример очень ну очень тщательного исследования с совершенно невообразимыми выводами.
попробуй проверять свои выводы формальной логикой.
 

fixxxer

К.О.
Партнер клуба
у меня часто чешется правая пятка. заметил что она всегда чешется когда дверь в туалет открыта, но если спустить воду в унитазе то перестает. сменил унитаз на новый, помогать перестало, почему подобный механизм не реализован в новом унитазе?
 

no_alex

Новичок
Автор оригинала: *****
пример очень ну очень тщательного исследования с совершенно невообразимыми выводами.
попробуй проверять свои выводы формальной логикой.
Пример тестового файла? - Пожалуйста, он очень простой (каким и должен быть):

PHP:
$a = print_r($_COOKIE, true);

session_set_cookie_params (0, '/', 'mydomain.com');
session_start();
$_SESSION[$_SERVER["HTTP_HOST"]] = date("Y-m-d H:i:s");
$b = print_r($_SESSION, true);

echo "<pre>", $a, "</pre>";
echo "<pre>", $b, "</pre>";
Запускаю этот файлик на разных субдоменах в зоне mydomain.com - смотрю результат.
Результаты этого исследования я уже описывал выше, повторять не буду. Принцип исследования, я думаю понятен из кода?
 

no_alex

Новичок
И что? Какя разница стартует сессия автоматически или я вручную её стартую?
Так я тоже пробовал. Но это не важно - я вижу что SID в куках есть и он правильный. Причём, он есть абсолютно на всех вышеописанных доменах. Но вот данные в массиве $_SESSION пропадают как только я перехожу на какой-то субдомен отличный от www.
И что?.... Поверьте, я перерыл уже много статей на эту тему, преждем чем задавать этот вопрос на форуме.
 

Crys

Двинутый новичок
Так я тоже пробовал. Но это не важно - я вижу что SID в куках есть и он правильный. Причём, он есть абсолютно на всех вышеописанных доменах. Но вот данные в массиве $_SESSION пропадают как только я перехожу на какой-то субдомен отличный от www.
Что значит "пропадают"? То есть они были, а потом исчезли?

-~{}~ 28.09.08 13:54:

Такое ощущение, что ты что-то недоговариваешь, так как твой код (с поправкой на .mydomain.com) работает так, как и должен работать.
 

fixxxer

К.О.
Партнер клуба
>>И что? Какя разница стартует сессия руками или я вручную её стартую?

а ты проверь и выключи если включено
 

no_alex

Новичок
Что значит "пропадают"? То есть они были, а потом исчезли?
Хорошо, поясню подробнее. В случае перехода между mydomain.com и www.mydomain.com я вижу две строки:
Array
(
[www.mydomain.com] => 2008-09-28 13:07:48
[mydomain.com] => 2008-09-28 13:09:13
)
Но как только я пытаюсь открыть этот файл на другом субдомене - я вижу только одну строку:
Array
(
[other.mydomain.com] => 2008-09-28 13:08:55
)
Возвращаюсь на один из предыдущих доменов - там тоже только одна строка (вновь сформированная, а тех что были до этого - нет).

Такое ощущение, что ты что-то недоговариваешь, так как твой код (с поправкой на .mydomain.com) работает так, как и должен работать.
Он нормально работает под windows. А под Linux - нет!
У кого-нибудь есть возможность повторить мой эксперимент под Linux? Попробуйте, пожалуйста.
 

fixxxer

К.О.
Партнер клуба
>>>Возвращаюсь на один из предыдущих доменов - там тоже только одна строка (вновь сформированная, а тех что были до этого - нет).

а, вот этот момент был непонятен. меняет дело.

phpinfo() с этого линукса покажи, с mydomain.com и с other.mydomain.com
 

Фанат

oncle terrible
Команда форума
блин при чем здесь линукс?
до тебя, похоже, не дошло. хотя два человека сказали - ВЫВОДЫ У ТЕБЯ НЕПРАВИЛЬНЫЕ

какие разработчики? что они там у тебя хотели ограничить?
при чем здесь линукс? с какого перепугу ты начал валить на весь линукс особенности ОДНОГО КОНКРЕТНОГО ХОСТИНГА?

что у тебя там в сессионных файлах зашифровано? почему единственнную осмысленную информацию - этот самый "шифр" нельзя сюда копировать?
 

Crys

Двинутый новичок
Он нормально работает под windows. А под Linux - нет!
Он одинаково работает и под windows и под linux. От системы это не зависит.
Ты перед тестированием браузер хоть перезапускал? Потому что то, что ты описываешь - возможно, если на субдомене ранее была запущена сессия.
 

no_alex

Новичок
что у тебя там в сессионных файлах зашифровано? почему единственнную осмысленную информацию - этот самый "шифр" нельзя сюда копировать?
Вот та выглядят данные в файле сессии под windows:
other.mydomain.com|s:19:"2008-09-28 14:32:50";www.mydomain.com|s:19:"2008-09-28 14:32:53";
А вот в таком виде они хранятся под Linux
KvexsAumWn8smHWMYBbi1XtfcH7H1o4jJZq_4PNkOmV6Re4ktZArFy9GTKDFSr_8cMMS0ntFDxAS8oaaVrouKFSZ30GPSg0GjkuDWL5fYyqN-pT7wp8R8SzAMb1iOjwKRPOAp6y_WGmfXWJbCwPg3w..

Но я не утверждаю, что причина в этом. Я только предполагаю, что причина кроется здесь.

Мне не важно как оно там реализовано. Мне важно передать данные из одного субдомена в другой. Так вот под windows (на моем компе) все работает без проблем, а под Linux (на сервере хостера) - нет. Возможно причина не в Linux, а в настройках сервера. Но еще раз повторюсь что касается настроек сессии, то тут у меня все точно соответствует серверу, за исключением того, что я назвал. Остальные настройки тоже практически идентичны.

В данный момент меня интересует только конечный результат - как передать сессию в другой домен?
Или какой-то альтернативный вариант типа:
A) передать данные в другой домен через $_GET или $_COOKIE - этот вариант отпадает сразу;
B) создать свой обработчик сессии и писать их в файл своим методом (или в БД) - пока не рассматриваю, т.к. хочу найти более простое решение;
C) Ваш вариант?

-~{}~ 28.09.08 14:57:

Ты перед тестированием браузер хоть перезапускал? Потому что то, что ты описываешь - возможно, если на субдомене ранее была запущена сессия.
Блин! Ну за кого Вы меня считаете? Конечно все перезапускал, очищал все куки и т.п.
 

kruglov

Новичок
Сессия состоит из двух частей: сессионная кука (хранилище идентификатора) и файл с сессионными даными. Таким образом, задача "обобществления" сессии на несколько поддоменов сводится в задаче обобществления каждой из двух частей. Что из частей получилось, а что - нет?
 

Фанат

oncle terrible
Команда форума
В данный момент меня интересует только конечный результат - как передать сессию в другой домен?
воспользоваться механизмом сессий.
который к субдоменам отношение имеет только в части работы кук.
если куки передаются нормально, то значит дело в твоем коде. отлаживай.
 

kruglov

Новичок
p.s.

В данный момент меня интересует только конечный результат - как передать сессию в другой домен?
Вообще-то конечная цель - это достижение мира и счастья, а все остальное - это суета.
 

no_alex

Новичок
Сессия состоит из двух частей: сессионная кука (хранилище идентификатора) и файл с сессионными даными. Таким образом, задача "обобществления" сессии на несколько поддоменов сводится в задаче обобществления каждой из двух частей. Что из частей получилось, а что - нет?
SID (через куки) передается нормально как у на моем компьютере (windows), так и на сервере (Linux).
Но массив $_SESSION (на Linux) при переходе в другой субдомен очищается. В этом нет никакого, т.к. я сейчас, для чистоты эксперимента, еще немного доработал тестовый файл:
PHP:
$c = print_r($_COOKIE, true);

session_set_cookie_params (0, '/', '.mydomain.com');
session_start();

$s1 = print_r($_SESSION, true);
$_SESSION[$_SERVER["HTTP_HOST"]] = date("Y-m-d H:i:s");
$s2 = print_r($_SESSION, true);

echo "COOKIE:<pre>",    $c,  "</pre>";
echo "SESSION 1:<pre>", $s1, "</pre>";
echo "SESSION 2:<pre>", $s2, "</pre>";
Результаты те же.
Может хоть кто-то попробовать повторить мой эксперимент, а не спорить голословно!?
 

kruglov

Новичок
А никто и не спорит, лениво просто ковыряться...

Кука передается - прекрасно, значит сессии параллельные заводятся - ищите, где.
 

Фанат

oncle terrible
Команда форума
Типичный случай из анекдота номер 6, "чего тут думать - тут прыгать надо!"
Хватит клянчить. Никто твой кривой код запускать не будет. Нам достаточно знаний о механизме сессий. Весьма примитивном, между прочим.

Лучше делай, что тебе говорят. С куками разобрался. Теперь что с файлами?

и почему ты не приводишь здесь вывод этого своего скрипта?
 

no_alex

Новичок
Кука передается - прекрасно, значит сессии параллельные заводятся - ищите, где.
С обоих субдоменов запись происходит в один и тот-же файл. Это я вижу по тому как файл меняется после релоада (на обоих субдоменах).

Я предполагаю, что для шифрования данных в этом файле, в качестве ключа, используется название домена (причем "www." в этом ключе - отбрасывается). Т.о., получается что между доменами mydomain.com и www.mydomain.com сессия передается без проблем. А при попытке получить эти данные с другого домена - данные сбрасываются, поскольку ключ не совпадает.
Но под windows данные не шифруются, поэтому там такой проблемы нет.
Так вот, если мои рассуждения правильные, то если изменить способ хранения сессий на Linux, то проблема будет решена. Вопрос: если можно это изменить, то как?
 
Сверху