Сессии и поддомены

Я пытался запустить свои сеансы на своих субдоменах, которые, я уверен, заработали в понедельник, но после добавления некоторого кода во вторник он не работает в среду! Я использовал код 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);, затем запускается сеанс. Затем я проверяю, не истек ли срок действия сеанса. Если срок действия сеанса истек, текущий сеанс уничтожается и сбрасывается, после чего создается новый сеанс. Остальное просто настройка информации о пользователе.

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

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

Майк


person michaeln31    schedule 09.03.2011    source источник


Ответы (3)


Пожалуйста, добавьте код :).

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

<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 [email protected]
    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 [email protected]
    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 будут доступны.

person Rene Terstegen    schedule 09.03.2011
comment
Я не смог добавить код к этому ответному сообщению, поэтому я создал новый ответ на эту тему, надеюсь, коду легко следовать. - person michaeln31; 09.03.2011
comment
У меня нет доступа к этой части моего сервера, поэтому я пытался использовать файл ini_set. Я свяжусь с моим провайдером и спрошу их. Должен ли ini_set не работать? - person michaeln31; 12.03.2011

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

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

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

person Tramov    schedule 09.03.2011
comment
Когда я вхожу в систему, меня перенаправляют обратно на главную страницу test.example.com. На этой странице нет взаимодействия с сеансами, но если я изменю URL-адрес на www.test.example.com, сеанс будет работать как обычно. - person michaeln31; 09.03.2011

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

На главной странице будет 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;
}

Файл сеанса включает в себя другой файл 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();
    }
}

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

person michaeln31    schedule 09.03.2011