เซสชันและโดเมนย่อย

ฉันพยายามทำให้เซสชันของฉันทำงานข้ามโดเมนย่อย ซึ่งฉันค่อนข้างแน่ใจว่าได้ทำงานในวันจันทร์ แต่หลังจากเพิ่มโค้ดในวันอังคาร มันก็ใช้งานไม่ได้ในวันพุธ! ฉันใช้รหัส 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>

ไปยังการกำหนดค่าโฮสต์เสมือนของคุณ นี่เป็นสิ่งเดียวที่เราต้องทำเพื่อให้ฟังก์ชันนี้ทำงานได้ ตอนนี้เราสามารถเข้าถึงโดเมนย่อยทั้งหมดด้วยคุกกี้เดียวกันโดยไม่ต้องเพิ่มโค้ดพิเศษทั้งหมด ฉันไม่ได้บอกว่านี่เป็นวิธีแก้ปัญหา แต่วิธีนี้ทำให้การทดสอบซับซ้อนน้อยลงมาก

แก้ไข

คุณสามารถตั้งค่าโฮสต์เสมือนในการกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณได้ สมมติว่าคุณใช้ 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"

เพิ่มบรรทัดนี้ในการกำหนดค่าเซิร์ฟเวอร์ทั้งหมดสำหรับโดเมนนี้ และคุกกี้ของคุณจะถูกแชร์

person Rene Terstegen    schedule 09.03.2011
comment
ฉันไม่สามารถเพิ่มรหัสลงในข้อความตอบกลับนี้ได้ ดังนั้นฉันจึงสร้างคำตอบใหม่สำหรับหัวข้อนี้ หวังว่ารหัสจะง่ายต่อการติดตาม - person michaeln31; 09.03.2011
comment
ฉันไม่สามารถเข้าถึงส่วนนั้นของเซิร์ฟเวอร์ของฉันได้ นั่นเป็นเหตุผลว่าทำไมฉันถึงพยายามใช้ ini_set ฉันจะติดต่อกับผู้ให้บริการของฉันและถามพวกเขา ini_set ไม่ควรทำงานใช่ไหม - person michaeln31; 12.03.2011

ซึ่งเป็นไปไม่ได้ที่จะแก้ไขข้อบกพร่องโดยไม่ทราบรายละเอียดเพิ่มเติม

คุณอาจต้องตรวจสอบก่อนว่าคุกกี้ได้รับการตั้งค่าอย่างถูกต้องหรือไม่ และคุกกี้ถูกส่งกลับไปยังเซิร์ฟเวอร์จริงหรือไม่

ใช้เครื่องมือที่ช่วยให้คุณเห็นส่วนหัวบนเบราว์เซอร์ของคุณ (แถบเครื่องมือนักพัฒนาเว็บ / liveheaders / firebug สำหรับ Firefox) และดูว่าเซิร์ฟเวอร์กำลังขอให้เบราว์เซอร์ยอมรับคุกกี้จริงหรือไม่ และเพื่ออะไร

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