Сессии и субдомены

Я пытался заставить свои сеансы работать в моих поддоменах, и я уверен, что работаю в понедельник, но после добавления кода во вторник его не работает в среду! Я использовал код ini_set("session.cookie_domain", $domain); где $domain = .example.com .

Главная страница моего сайта в настоящее время находится на test.example.com, и я получаю доступ к странице входа через test.example.com/login . Когда я ввожу этот адрес, URL-адрес в адресной строке автоматически изменяется на http://www.test.example.com/login , и в этом проблема. Сеанс создан для сайта www.test.example.com но большинство ссылок на сайте прямо в test.example.com/<sub folder> .

Единственное, что я могу думать о том, что это может быть отброшено, – это то, как я обрабатываю сеансы. На каждой странице начинается сеанс. Сначала ini_set("session.cookie_domain", $domain); , то сеанс запускается. Затем я проверяю, истек ли сеанс. Если сеанс истек, текущий сеанс уничтожается и отменяется, тогда создается новый сеанс. Остальное – это просто настройка информации о пользователе.

Единственное, что я добавил недавно, это проверка срока действия сеанса. Я пробовал обходить его, но ничего не изменил.

Любая помощь приветствуется. Я могу отправить код, если это упростит.

Майк

Solutions Collecting From Web of "Сессии и субдомены"

Добавьте код :).

Я могу только сказать вам, как мы достигли той же функциональности. Попробуйте добавить

 <directory "/path/to/your/docroot"> php_value session.cookie_domain ".example.com" </directory> 

к вашим конфигурациям виртуального хоста. Это было единственное, что нам нужно было сделать, чтобы эта функциональность работала. Теперь мы можем получить доступ ко всем подобластям с теми же файлами cookie без добавления всего дополнительного кода. Я не говорю, что это решения, но этот подход делает тестирование намного менее сложным.

редактировать

Вы можете установить виртуальные хосты в конфигурации вашего веб-сервера. Предполагая, что вы используете apache, они будут либо в httpd.conf, либо присутствовать в других файлах файловой системы, которые включены в ваш httpd.conf. Где httpd.conf находится в вашей системе, зависит от вашей конфигурации, но если вы используете Linux, он, вероятно, будет где-то в / etc / apache, / etc / httpd, / usr / local / apache, / usr / local / httpd

После того, как вы разместите этот файл, у него будет одна или несколько записей, например:

 <VirtualHost *:80> ServerAdmin webmaster@yourdomain.org DocumentRoot /var/www/yourdomain/www ServerName yourdomain.org <directory "/var/www/yourdomain/www"> Options FollowSymLinks Includes AllowOverride All Order allow,deny Allow from all </directory> </VirtualHost> 

И измените код, который выглядит так:

 <VirtualHost *:80> ServerAdmin webmaster@yourdomain.org DocumentRoot /var/www/yourdomain/www ServerName yourdomain.org <directory "/var/www/yourdomain/www"> Options FollowSymLinks Includes AllowOverride All Order allow,deny Allow from all php_value session.cookie_domain ".yourdomain.org" </directory> </VirtualHost> 

Обратите внимание на php_value session.cookie_domain ".yourdomain.org" .

Добавьте эту строку ко всей конфигурации сервера для этого домена, и ваши файлы cookie будут доступны.

Это невозможно отлаживать, не зная подробностей.

Возможно, вы захотите сначала проверить, правильно ли настроены файлы cookie, и если они действительно возвращаются на сервер.

Используйте инструмент, который позволяет видеть заголовки в вашем браузере (панель инструментов webdeveloper / liveheaders / firebug для Firefox) и посмотреть, действительно ли сервер запрашивает, чтобы браузер принял cookie – и для чего.

Простите меня за незнание, но что такое «виртуальные хост-конфиги». Мой код работает примерно так:

Главная страница будет включать session.php

 function Session() { $this->time = time(); $this->startSession(); } function startSession() { global $serverFunctions; $serverFunctions->setSubdomainSharing(); session_start(); $this->checkSessionLife(); //check if user is logged in $this->logged_in = $this->checkLogin(); //if user is not logged in then it is given guest credintials if (!$this->logged_in) { $this->user_name = $_SESSION['user_name'] = GUEST_NAME; $this->user_level = $_SESSION['user_level'] = GUEST_LEVEL; } if (!isset($_SESSION['language'])) { $this->setLanguage("translation_english"); } else { $this->user_language = $_SESSION['language']; } } function checkSessionLife() { global $serverFunctions; if (isset($_SESSION['start_time'])) { $session_life = time() - $_SESSION['start_time']; if ($session_life > 15) { $this->logout(); $serverFunctions->setSubdomainSharing(); session_start(); } } else if (!isset($_SESSION['start_time'])) { //logout any session that was created //before expiry was implemented $this->logout(); $serverFunctions->setSubdomainSharing(); session_start(); } $_SESSION['start_time'] = time(); } function logout() { global $database; // Unset session variables session_destroy(); session_unset(); //session_regenerate_id(true); $this->logged_in = false; // Set user level to guest $this->user_name = GUEST_NAME; $this->user_level = GUEST_LEVEL; } из function Session() { $this->time = time(); $this->startSession(); } function startSession() { global $serverFunctions; $serverFunctions->setSubdomainSharing(); session_start(); $this->checkSessionLife(); //check if user is logged in $this->logged_in = $this->checkLogin(); //if user is not logged in then it is given guest credintials if (!$this->logged_in) { $this->user_name = $_SESSION['user_name'] = GUEST_NAME; $this->user_level = $_SESSION['user_level'] = GUEST_LEVEL; } if (!isset($_SESSION['language'])) { $this->setLanguage("translation_english"); } else { $this->user_language = $_SESSION['language']; } } function checkSessionLife() { global $serverFunctions; if (isset($_SESSION['start_time'])) { $session_life = time() - $_SESSION['start_time']; if ($session_life > 15) { $this->logout(); $serverFunctions->setSubdomainSharing(); session_start(); } } else if (!isset($_SESSION['start_time'])) { //logout any session that was created //before expiry was implemented $this->logout(); $serverFunctions->setSubdomainSharing(); session_start(); } $_SESSION['start_time'] = time(); } function logout() { global $database; // Unset session variables session_destroy(); session_unset(); //session_regenerate_id(true); $this->logged_in = false; // Set user level to guest $this->user_name = GUEST_NAME; $this->user_level = GUEST_LEVEL; } из function Session() { $this->time = time(); $this->startSession(); } function startSession() { global $serverFunctions; $serverFunctions->setSubdomainSharing(); session_start(); $this->checkSessionLife(); //check if user is logged in $this->logged_in = $this->checkLogin(); //if user is not logged in then it is given guest credintials if (!$this->logged_in) { $this->user_name = $_SESSION['user_name'] = GUEST_NAME; $this->user_level = $_SESSION['user_level'] = GUEST_LEVEL; } if (!isset($_SESSION['language'])) { $this->setLanguage("translation_english"); } else { $this->user_language = $_SESSION['language']; } } function checkSessionLife() { global $serverFunctions; if (isset($_SESSION['start_time'])) { $session_life = time() - $_SESSION['start_time']; if ($session_life > 15) { $this->logout(); $serverFunctions->setSubdomainSharing(); session_start(); } } else if (!isset($_SESSION['start_time'])) { //logout any session that was created //before expiry was implemented $this->logout(); $serverFunctions->setSubdomainSharing(); session_start(); } $_SESSION['start_time'] = time(); } function logout() { global $database; // Unset session variables session_destroy(); session_unset(); //session_regenerate_id(true); $this->logged_in = false; // Set user level to guest $this->user_name = GUEST_NAME; $this->user_level = GUEST_LEVEL; } 

Файл сеанса включает еще один PHP-файл, называемый serverFunctions . Это просто класс, который позволяет мне форматировать URL-адрес и т. Д.

 function getAddressPrefix() { $address_prefix = ""; if ($_SERVER['SERVER_ADDR'] == '127.0.0.1') { $address_prefix = "http://localhost/myproject"; } else { $address_prefix = $this->getServerName(); } return $address_prefix; } function getServerName() { return "http://" . str_replace("www.", "", $_SERVER['SERVER_NAME']); } function formatRequestingPage() { return $this->getServerName() . $_SERVER['SCRIPT_NAME']; } function setSubdomainSharing() { if ($_SERVER['SERVER_ADDR'] != '127.0.0.1') { $domain = $this->getServerName(); do { $domain = substr($domain, strpos($domain, ".", 0) + 1); } while (substr_count($domain, ".") > 1); $domain = ".".$domain; ini_set("session.cookie_domain", $domain); } } 

Когда пользователь входит в систему, запрос на вход обрабатывается process_request.php

 function LoginReq() { global $session; global $variables; global $serverFunctions; $retval = $session->login($_POST['user_name'], $_POST['password']); if ($retval) { header("Location: " . $serverFunctions->getAddressPrefix()); exit(); } else { $_SESSION['variables_array'] = $_POST; $_SESSION['error_array'] = $variables->getErrorArray(); header("Location: " . $serverFunctions->getAddressPrefix() . "/login/"); exit(); } } 

Если мне что-то не хватает или нужно объяснить, что происходит, немного больше дайте мне знать.