Сессии и субдомены - PullRequest
       29

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

2 голосов
/ 09 марта 2011

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

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

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

Майк

Ответы [ 3 ]

1 голос
/ 09 марта 2011

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

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

<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" line.

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

0 голосов
/ 09 марта 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();
    }
}

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

0 голосов
/ 09 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...