2012-07-12 115 views
1

真的很煩人的問題我無法解決/只能部分解決。不錯的多汁給你的專業人士。重定向後PHP會話丟失

我已經設置了一個基本的登錄系統。就像這樣:

的login.php:

  1. 線1:session_start();
  2. 檢查if($_SESSION['logged_in'] == true) header("Location: /controls.php);,櫃面他們已經進入了他們的詳細資料。
  3. 如果他們沒有進入他們的是,用戶輸入的憑據,如果有效:$_SESSION['logged_in'] = true;
  4. 後數據庫憑證進行檢查,並會被設置爲true,重定向考慮使用PHP header("Location: /controls.php);

承受,會話現在已設置。

Controls.php

  1. 線1:session_start();
  2. 線2:if($_SESSION['logged_in'] != true) {header("Location: /index.php");}

瞬間我得到採取的index.php僅適用於Chrome和Firefox。

此外,我有accounttools.php,其中會議再次需要。一旦我嘗試訪問accounttools.php,會話將被銷燬/取消設置,並且任何嘗試加載accounttools.php的結果都會導致標題重定向到我的/index.php頁面,而且僅在FIREFOX和CHROME中。

我也得添加一些東西。如果我回到login.php並重新登錄,一切正常,會話設置正確。這是基於瀏覽器的錯誤嗎? PHP在任何數據被髮送到瀏覽器之前執行,那麼如果這些瀏覽器在任何事情到達用戶的時候已經被執行了,那麼這些瀏覽器如何行動呢?

登錄文件:

// Login.php 
<?php session_start(); 

if($_SESSION['logged_in'] == true) 
{ 
    header("Location: /controls.php"); 
    exit(); 
} 

if($_POST['username_login'] && $_POST['password_login']) 
{ 
    // Do necessary database work to check credentials (edited out here). 
    // ...  
    // Check re-hashed pass against database hash (password checking) 
    if($make_password == $current_user[0]['password']) 
    { 
     // If this is OK login is a success. 
     $_SESSION['logged_in'] = true; 
     header("Location: /controls.php"); 
     exit(); 
    } 
} 
?> 

控制文件:

// controls.php 
// This page instantly redirects to index.php 
<?php session_start(); 

// Go to homepage if logging out. 
if($_POST['logging_out']) 
{ 
    unset($_SESSION['logged_in']); 
    header("Location: /index.php"); 
    exit(); 
} 
// No access unless logged in. 
// This session seems to no longer exist at this point. Why?? 
if($_SESSION['logged_in'] != true) 
{ 
    header("Location: /index.php"); 
    exit(); 
} 
?> 

編輯:我發現別的東西:如果我登錄並手動輸入$_SESSION -restricted頁面的URL,該$_SESSION不被破壞。

有一部分header()重定向導致$_SESSION在Google和Mozilla中未被設置/銷燬。

我也一直在谷歌搜索瘋狂,顯然這是PHP編碼器之間的共同問題。有人必須知道這是什麼?

+0

有兩個問題:1)你爲什麼要在你的'session_start()'之後關閉並打開你的PHP標記,2)在你的登錄頁面上,爲什麼當你只使用'Location'時輸出腳本來重定向?頭?我假設你在第400行之前有一些輸出,但這也沒什麼意義,因爲你的登錄檢查應該在腳本的開始處是正確的。 – SenorAmor 2012-07-12 01:20:14

+0

他們都看起來像相對重定向,但我不得不問 - 你在HTTP和HTTPS之間彈跳嗎?你沒有在域名之間移動(甚至是www。到非www)。你還沒有禁用cookies? – 2012-07-12 01:21:13

+0

John C:我沒有在HTTP和HTTPS之間切換,它們都在同一個域和同一個目錄中。 SenoAmor:我不知道我爲什麼這麼做,是一個複製/粘貼工作。我現在修改了我的login.php文件以使用PHP中的header()重定向,並將登錄檢查移至文件的開頭。但是,我仍然失去了兩頁之間的會話。 – George88 2012-07-12 01:32:49

回答

1

我看到一個問題,你成功登錄後重定向的方式:它是一個JavaScript重定向,所以它只會發生在所有的PHP已經完成執行並且結果已被髮送到瀏覽器。這意味着你的重定向之後的代碼也會被執行。

我建議不輸出任何內容到瀏覽器,直到最後一刻,並使用:要重定向這樣,你就一定不會發生什麼意外你會重定向代碼後到處

header("Location: /..."); 
exit(); 

組合。

要避免遇到headers already sent問題,我會還建議擺脫的東西,如:

?> 
<?php 

像的login.php第一線。