Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Сессии в поддоменах


Автор: Majesty 20.12.2010, 14:51
Есть группа сайтов (поддомены одного домена).
www.domain - лежит в корневой папке домена
passport.domain - лежит в папке passport
и т.д.

На всех сайтах есть форма авторизации, проверяющая, авторизован ли пользователь (читает сессию). Если пользователь авторизован - ему выдаётся меню со ссылками. Если не авторизован - выдаётся непосредственно форма авторизации (логин, пароль, сабмит), отправляемая на passport.domain/login?site=сайт.

Если заполнять форму с passport.domain авторизация работает отлично. Если заполнять с www.domain - создаётся пустая сессия и авторизация не проходит. В самом скрипте login.php всё в порядке - проверял, данные вычитываются из базы и складываются в $_SESSION. На диске файл с "чужой" сессией занимает 0 байт 

В 5.2.13 (и, кажется, в 5.3.2) всё работало, вчера обновился до 5.3.3 - вылез косяк.

В php.ini всё выставлено как надо - куки сессии отдаются с путём / и доменом .domain (т.е. "любой поддомен для domain"), время жизни - 0 (до закрытия браузера). Чему свидетельство - файрбаг - перемещаясь по сайтам наблюдаю везде одинаковую куку PHPSESSID. После логина на passport.domain кука меняется. Если логин идёт с www.domain - остаётся прежней (и соответствующий файл с сессией не дописывается).

Если после удачного логина на passport.domain перейти на www.domain сессия обнуляется, кука не меняется.

Пыха работает в режиме cgi/fast-cgi, сервер lighttpd 1.4.26

Добавлено @ 14:58
Вот код:
Код

$url = "www.domain";
if($_REQUEST['site']) {
    $url = $_REQUEST['site'];
}
...
$result = $db->query("... LIMIT 1");
if($db->num_rows($result) === 1) {
    sesson_start();
    $_SESSION['info'] = $db->fetch_assoc($result);
    session_write_close();
    header("Location: http://{$url}/");
    exit;
}
...
Опытным путём установлено, что если редиректить на passport.domain, то на нём я буду авторизован. Если пытаюсь редиректить на другой домен - выкидывает из авторизации.

Автор: Majesty 20.12.2010, 18:45
Мешает Suhosin Patch. Без него всё работает замечательно. Может есть какая-то настройка? Чтобы его полностью не отключать...

Автор: Majesty 21.12.2010, 09:38
нужно было добавить в конфиг это:
Код
suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)