我有一個包含公共和私人部分的網站。要訪問私有區域,用戶必須登錄,這會設置會話變量。登錄腳本驗證一切,然後更改了標題位置到私有頁:
//get info from database and if user is authorized, then redirect
session_start();
$_SESSION['authorized'] = $user;
$_SESSION['firstname'] = $first;
$_SESSION['lastname'] = $last;
$_SESSION['password'] = $pass;
$_SESSION['position'] = $position;
$_SESSION['email'] = $email;
header("Location: index2.php");
然後index2.php頁面上,我有一個授權檢查頂部:
session_start();
if(!isset($_SESSION['authorized'])){
header("Location: denied_unauth.php");
die();
}else{
//rest of page
一切工作像魅力。除了...如果20分鐘內沒有活動,用戶必須重新登錄。Index2.php使用jQuery將div加載到它中,因此用戶永遠不會離開index2.php。如果他們點擊後在不活動的情況下在私人網站上檢索頁面,而不是他們請求的div,他們會收到「已註銷」消息,並再次顯示登錄表單。它與上面列出的腳本完全相同,設置完全相同的會話變量並將它們重定向回到完全相同的頁面(index2.php),這是他們登錄的同一頁面 - 基本上,只是重新加載頁面。
每當我測試這個,index2.php不認識新的會話。它每次都會將用戶發送到「denied_unauth.php」。這告訴我,登錄腳本正在工作,它正在識別用戶名和密碼並將用戶發送到index2.php ...但是當頁面重新加載index2.php時,會話無法識別。我甚至嘗試的情況下,添加一個隨機數到URL的末尾「index2.php somerandomnumber這是一個緩存的問題,但它並沒有幫助
任何想法
編輯:??要我想知道爲什麼,如果在登錄回腳本中創建新的會話變量,在重新加載時不會識別它們會話變量是在他們第一次登錄時創建的,所以我知道腳本的一部分工作,但是當他們在重新登錄後再次返回到頁面時,它不會識別新的$ _SESSION ['授權']。
編輯2:這裏是正在發生的事情:
- 從頁面的index.php,用戶登錄時的登錄表單創建一個會話和重定向頭index2.php
- 頁index2.php檢查是否會話被設置,如果沒有,則將用戶踢出「拒絕訪問」頁面。
- 用戶單擊index2.php頁面中的鏈接可將部分加載到主格
- 加載到主格的每個文件都會檢查它是否設置了會話。如果會話存在,則加載文件,如果會話過期,則代替該文件,它會向用戶顯示登錄表單並要求他們重新登錄。(所有這些工作到目前爲止)
- 當用戶登錄時從這個表單中創建一組新的會話變量。我已經嘗試設置一個新的會話或session_regenerate_id(),似乎都沒有工作。
- 這個新的會話不被index2.php識別,它每次都會把它們踢出去。我已經嘗試在登錄後直接重定向到index2.php,或者只是首先加載他們請求的div,但是這兩種方式,index2.php都沒有看到會話已設置,用戶最終在「拒絕訪問」頁面。
如果這是一個會話生命期問題(我不完全確定我完全理解它),這應該有所幫助:http://stackoverflow.com/questions/1173524/php-session-lifetime-problem – 2011-04-23 13:40:30
@Pekka它應該是一個會話生活中的問題,通過問題的氣味。 – mauris 2011-04-23 13:42:10