2014-01-13 130 views
0

對不起,我不能就已經回答的問題提出問題,因爲我剛剛註冊。PHP會話過期問題

我的問題是會話過期。

它工作正常,並在時間設置後註銷。

我的問題是,當沒有登錄,我重新訪問該網站,然後重定向到註銷頁面。我很確定這對我的seo產生了負面影響。

這是我用過的代碼。

// ********************************* // 
// ************ SESSIONS *********** // 

// stops javascript from getting the session id. phpacademy 
ini_set('session.cookie_httponly', true); 

// Start the session: 
session_start(); 

// http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes 
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) { 
    // last request was more than 60 minutes ago 
    session_destroy(); // destroy session data in storage 
    session_unset();  // unset $_SESSION variable for the runtime 
    header('Location: logged-out.php'); 
    } 

    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp 

// http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes 
if (!isset($_SESSION['CREATED'])) { 
    $_SESSION['CREATED'] = time(); 
    } else if (time() - $_SESSION['CREATED'] > 1800) { 
    // session started more than 30 minutes ago 
    session_regenerate_id(true); // change session ID for the current session an invalidate old session ID 
    $_SESSION['CREATED'] = time(); // update creation time 
    } 

// stops them using proxy servers and other ip addresses. 
if (isset($_SESSION['last_ip']) === false);{ 
    $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR']; 
    } 

if ($_SESSION['last_ip'] !== $_SERVER['REMOTE_ADDR']){ 
    session_unset(); 
    session_destroy(); 
    } 

// ************ SESSIONS *********** // 
// ********************************* // 

我能做些什麼來阻止重定向到註銷時我已經註銷?

我可以看到這是使用statcounter其他人正在發生,他們的訪問頁面是註銷的?

請指教。

+2

所以我會想象這是你的第一個條件導致的問題。你有沒有試過'var_dump($ _ SESSION ['LAST_ACTIVITY'])'來看看它給你什麼值,你不期待?我可以想象,如果你有'$ _SESSION ['LAST_ACTIVITY']這樣一個空字符串值(因爲'time() - 0'總是> 1800),你寫時間比較的方式可能會產生問題。 –

+0

自動重定向到受保護內容的登錄頁面是一個好主意,自動重定向到註銷頁面不是;只有在訪問者真正註銷後(按下按鈕)才能指向註銷的頁面。 – jeroen

+0

@ jeroen謝謝,我有兩個登錄狀態與登錄表單。只是一個人會顯示你已經自動註銷,並感謝你已經安全註銷。兩者都有登錄表單。這仍然是一個問題嗎? – user3191101

回答

0

正如php文檔中有關會話的規定,除了簡單地調用session_unsetsession_destroy之外,清理/銷燬會話還有很多事情要做。要永久刪除會話,您還必須銷燬會話Cookie。要做到這一點看here

而且順便說一句,在調用session_unsetsession_destroy後什麼也不做,session_unset應該叫session_destroy之前調用,因爲一旦你摧毀了會話與當前會話相關的數據將不再可訪問(雖然它是仍然存儲在您的服務器上,並且可以通過會話cookie再次訪問)。