Sesi dan subdomain

Saya telah mencoba menjalankan sesi saya di seluruh subdomain saya, yang saya yakin saya berhasil pada hari Senin tetapi setelah menambahkan beberapa kode pada hari Selasa, sesi tersebut tidak berfungsi pada hari Rabu! Saya telah menggunakan kode ini_set("session.cookie_domain", $domain); di mana $domain = .example.com.

Halaman utama situs saya saat ini terletak di test.example.com dan saya mengakses halaman login melalui test.example.com/login. Ketika saya memasukkan alamat ini, url di bilah alamat otomatis berubah menjadi http://www.test.example.com/login, dan di sinilah letak masalahnya. Sesi ini dibuat untuk www.test.example.com tetapi sebagian besar tautan di situs mengarah ke test.example.com/<sub folder>.

Satu-satunya hal yang terpikir oleh saya yang mungkin membuat saya gagal adalah cara saya menangani sesi. Di setiap halaman, sesi dimulai. Pertama ini_set("session.cookie_domain", $domain); disetel, lalu sesi dimulai. Selanjutnya saya memeriksa untuk melihat apakah sesi tersebut telah kedaluwarsa. Jika sesi telah kedaluwarsa, sesi saat ini dimusnahkan dan tidak disetel, maka sesi baru akan dibuat. Selebihnya hanya mengatur informasi pengguna.

Satu-satunya hal yang saya tambahkan baru-baru ini adalah pemeriksa kedaluwarsa sesi. Saya sudah mencoba melewatinya tetapi tidak mengubah apa pun.

Bantuan apa pun sangat dihargai. Saya dapat memposting kode jika itu membuatnya lebih mudah.

Mike


person michaeln31    schedule 09.03.2011    source sumber


Jawaban (3)


Silakan tambahkan beberapa kode :).

Saya hanya dapat memberi tahu Anda bagaimana kami mencapai fungsi yang sama. Coba tambahkan

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

ke konfigurasi host virtual Anda. Ini adalah satu-satunya hal yang harus kami lakukan agar fungsi ini berfungsi. Sekarang kita dapat mengakses semua subdomain dengan cookie yang sama tanpa menambahkan semua kode tambahan. Saya tidak mengatakan ini adalah solusi, tetapi pendekatan ini membuat pengujian menjadi lebih mudah.

Edit

Anda dapat mengatur host virtual dalam konfigurasi server web Anda. Dengan asumsi Anda menggunakan Apache, mereka akan berada di httpd.conf atau ada di file lain pada sistem file yang disertakan dalam httpd.conf Anda. Letak httpd.conf di sistem Anda bergantung pada konfigurasi Anda, namun jika Anda menggunakan Linux mungkin lokasinya berada di /etc/apache, /etc/httpd, /usr/local/apache, /usr/local/httpd

Setelah Anda menemukan file ini, ia akan memiliki satu atau lebih entri seperti ini:

<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>

Dan ubah kodenya menjadi seperti ini:

<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>

Perhatikan baris php_value session.cookie_domain ".yourdomain.org".

Tambahkan baris ini ke semua konfigurasi server untuk domain ini dan cookie Anda akan dibagikan.

person Rene Terstegen    schedule 09.03.2011
comment
Saya tidak dapat menambahkan kode ke pesan balasan ini jadi saya membuat jawaban baru untuk topik ini, semoga kodenya mudah diikuti. - person michaeln31; 09.03.2011
comment
Saya tidak memiliki akses ke bagian server saya itu, itu sebabnya saya mencoba menggunakan ini_set. Saya akan menghubungi penyedia saya dan menanyakannya. Haruskah ini_set tidak berfungsi? - person michaeln31; 12.03.2011

Ini tidak mungkin untuk di-debug tanpa mengetahui detail lebih lanjut.

Anda mungkin ingin memeriksa terlebih dahulu apakah cookie telah disetel dengan benar, dan apakah cookie benar-benar dikembalikan ke server.

Gunakan alat yang memungkinkan Anda melihat header di browser Anda (webdeveloper toolbar / liveheaders / firebug untuk Firefox) dan lihat apakah server benar-benar meminta browser menerima cookie - dan untuk apa.

person Tramov    schedule 09.03.2011
comment
Ketika saya masuk saya diarahkan kembali ke halaman utama, test.example.com. Tidak ada interaksi dengan sesi di halaman ini tetapi jika saya mengubah url menjadi www.test.example.com sesi berfungsi seperti biasa. - person michaeln31; 09.03.2011

Maafkan saya karena tidak mengetahui apa itu 'konfigurasi host virtual'. Kode saya berjalan seperti ini:

Halaman utama akan mencakup 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;
}

File sesi menyertakan file PHP lain yang disebut serverFunctions. Ini hanyalah kelas yang memungkinkan saya memformat URL dan semacamnya.

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);
    }
}

Saat pengguna masuk, permintaan masuk ditangani oleh 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();
    }
}

Jika saya melewatkan sesuatu atau perlu menjelaskan lebih lanjut apa yang terjadi, beri tahu saya.

person michaeln31    schedule 09.03.2011