У меня есть сайт, работающий с двумя субдоменами, для которых требуется логин (на основе тех же данных доступа к БД). Чтобы облегчить пользователям, я хотел изменить его, чтобы они могли перемещаться по обоим субдоменам без необходимости входа в систему отдельно: по существу, они регистрируются в одном из поддоменов и затем могут свободно перемещаться между ними.
Одно решение, которое я нашел в разделе Разрешить сеансы php переносить на поддомены, включает изменение переменной session.cookie_domain так, чтобы все поддомены делили переменные сеанса, но что-то кажется неправильным. Я все еще могу войти в subdomain1 и перемещаться по нему, но как только я загружаю страницу из subdomain2, subdomain1 мгновенно теряет все свои данные сеанса, и я возвращаюсь на страницу входа. Это также происходит наоборот (сначала вход из субдомена2). До изменения субдомены могли одновременно регистрироваться, но они не «видели» друг друга.
Что может вызвать эту проблему?
Мой подозреваемый – это функция шифрования сеанса проекта suhoshin , этот набор исправлений включен в большинство систем на основе debian. Он может быть сконфигурирован для кодирования содержимого файла сеанса с помощью ключа, сгенерированного из разных источников, для защиты содержимого сеанса от других сценариев php, работающих на одном компьютере (общий хостинг) или захвате сеанса. Одним из источников является docroot (включен по умолчанию), который обычно различается для каждого поддомена.
Простой phpinfo()
будет сообщать о расширении и его настройках, искать блок с именем suhosin
и ниже, чтобы посмотреть, suhosin.session.encrypt
ли suhosin.session.encrypt
и suhosin.session.cryptdocroot
Очевидно, вы можете отредактировать php.ini, чтобы отключить все шифрование или только часть docroot, если у вас есть доступ к серверу.
Если вы этого не сделаете, и на сервере работает apache, попробуйте отключить его в файле .htaccess
корня вашего php-приложения следующим образом:
php_flag "suhosin.session.cryptdocroot" 0
Если его работа, вы должны увидеть разницу в выходе phpinfo (). (Локальный столбец значений)
Если ваш хост не разрешает файл .htaccess
, вы можете установить одну и ту же переменную в php, но важно сделать это до session_start()
. Надеюсь, у вас есть какой-то фронт-контроллер, чтобы разместить это.
ini_set('suhosin.session.cryptdocroot', 0); phpinfo();
Вывод phpinf должен быть таким же, как в методе .htaccess
, cryptdocroot с локальным значением «Off».