[英]Sessions and php redirect doesn't work
我正在制作一個PHP腳本check.php
來檢查用戶是否已登錄。只有一個用戶,所以密碼直接寫在php代碼中。 check.php
包含在每個相關頁面的頂部(第1行),行<? include "check.php"; ?>
<? include "check.php"; ?>
<? include "check.php"; ?>
。
我已經刪除了密碼和域名。 除此之外,以下是我的代碼。 這里的要點是您在登錄頁面輸入密碼,然后通過POST將其發送到此腳本。
如果密碼是正確的 xxx,會話login
將存儲為true
。
如果密碼不正確 ,但被設置,這意味着在一些錯誤鍵入的用戶,任何現有會話與結束session_destroy()
這意味着他將被注銷。
如果他到達頁面但未登錄 ,則會話login
應為false或未設置,這意味着將使用} elseif(!($_SESSION['login'])) {
。
最后,如果他點擊退出按鈕,他將使用url發送到此腳本: check.php?logout=true
。 logout=true
應該在最后的elseif語句中的$_GET
中捕獲,並且會話應該在那里結束。
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
} elseif (isset($_POST['password'])) { // Wrong password
session_destroy();
header("Location: http://www.url.com/administration/login.php?true");
} elseif(!($_SESSION['login'])) { // Check at every page
header("Location: http://www.url.com/administration/login.php");
} elseif($_GET['logout']) { // Log out
session_destroy();
header("Location: http://www.url.com/");
}
ob_flush();
?>
在每個if語句中,我嘗試重定向。 我使用header("Location:...)
,但它在任何情況下都不起作用。因為header
命令必須是根據規范發送到瀏覽器的第一個請求,所以我使用了ob_start();
和ob_flush();
如此處所述 。無論是否有這些都無效。
此外,會話存在無法存儲內容的問題。 我不能在某些原因的會話中存儲true
。 我的代碼是否存在問題導致其失敗?
作為測試,我試圖在每個if
/ ifelse
語句中編寫一個echo
命令。 從那里我發現腳本總是進入第三個語句 - 帶有!($_SESSION['login'])
語句。
到現在為止還挺好。 這告訴我腳本能夠檢測到會話未設置。
剩下的兩個問題是:
任何建議將被認真考慮。
為了清楚說明發生了什么(以及什么不發生),我在不同的地方放了一些echo
。 以上代碼的這個片段帶有一些額外的echo
:
...
echo "Input: " . $_POST['password'];
echo "<br>Session before: " . $_SESSION['login'];
if($_POST['password'] == 'xxxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
echo "<br>Session after: " . $_SESSION['login'];
echo "<br>The first if works";
} ...
返回以下輸出:
Input: xxxx
Session before:
Session after: 1
The first if works
(xxxx是密碼;它是正確的。)
這是您登錄的情況。您剛剛寫了密碼並已發送到check.php
。
所以,我可以在這里看到它if
應該的那樣訪問第一個。 會話正確設置為true
(或1
)。 當我刷新頁面時,會話不再被設置。 不應該嗎?
header
重定向顯然沒有做任何事情。
所以,感謝下面@EmilF的回答,我發現我的會話ID - 我可以用echo session_id();
打印到屏幕上echo session_id();
- 每次頁面轉換或頁面刷新時的更改似乎是一些新的隨機數。 我看起來好像存儲在會話中的數據被遺忘了,因為新的會話ID指向其他地方。
通過使用:
<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...
其中cutckilc16fm3h66k1amrrls96
只是一個隨機數,會話ID是固定的,現在可以在頁面刷新后再次檢索存儲的數據。 這非常有效; 雖然有點奇怪但是有必要。
現在我只需要頭重定向工作......
嗯,這聞起來像是被關閉的東西。 會話和標頭功能已更改。 也許這是來自主機的一些PHP設置。 阻止標頭請求的東西。
未完待續...
請參閱下面的答案。
當我將文件更改為另一種編碼格式時,例如從ANSI到UTF-8,會在文件的開頭創建一些奇怪的符號。 創建的符號是
,我無法在自己的編輯器中看到它們。 因為它們位於php腳本的前面,所以它們會阻止header
和session_start()
以正常方式工作。 為什么它們被創造出來對我來說仍然是一個謎。
哦,讓我們列出你可以在這里調試的所有內容,還提到你已經做過的事情(所以其他人可以閱讀):
Location:
標頭發送到您的瀏覽器。 error_reporting(E_ALL);
? $_POST
數組執行var_dump()
。 PHPSESSID
cookie(登錄后)。 如果沒有,您的URL應包含有關會話ID的一些信息(如下所示: ?PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4
)。 否則,PHP無法找到會話,因為它不知道哪個會話屬於您。 如果這無助於檢查cookie是否已設置:
Set-Cookie
命令中完成。 它可能如下所示: Set-Cookie: PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4; path=/
Set-Cookie: PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4; path=/
php.ini
的設置。 必須設置session.use_cookies = 1
,必須設置為1
或On
以允許PHP使用cookie。 session.use_only_cookies = 0
的php.ini
設置。 如果設置為1
,則禁止PHP使用URL,如果瀏覽器不接受cookie。 出於安全原因,這通常是被禁止的,因為人們將URL復制到朋友,然后這些朋友將接管登錄的會話;)所以只需將其設置為0
以進行調試。 var_dump()
session_start()
的返回值。 如果PHP無法正確啟動會話,它將返回false。 嘗試使用session_id()打印PHPSESSID。 如果你保持清爽,你會得到相同的輸出?
如果沒有嘗試設置id:session_id('cutckilc16fm3h66k1amrrls96')
http://php.net/manual/en/function.session-id.php
它現在應該工作,但所有用戶使用相同的會話。
問題可能是這樣的: PHP會話數據沒有被保存
經過許多漫長的日日夜夜的測試,閱讀和詢問以及參與者對此問題的大量幫助 - 非常感謝您的努力! - 我慢慢地達成了這個相當神秘的問題解決方案。
我找到了一個解決方案,但我仍然沒有解釋......
因此,如更新2中所述,我從@EmilF的答案中發現會話ID不斷變化。 然后想到了一個服務器/主機問題。 我聯系了主持人 - one.com - 他最初和我一樣不理解,為什么它不起作用。
但他告訴我, check.php
文件的開頭有一些相當奇怪的符號。 我在自己的編輯器中看不到它們。 在我通過one.com提供基於瀏覽器的FileManager軟件訪問文件之前,它們不可見。
文件的頂部看起來像這樣:
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
...
你可以在開頭看到奇怪的符號
正如我所說,它們在我自己的編輯器Notepad ++ 中不可見,也不在常規記事本中。 我將文件發送給朋友檢查,他無法在他的編輯Coda中看到它們。
這些符號當然會作為瀏覽器的輸出。 因此,這是對session_start()
和header(Location:...
之前出現的瀏覽器的請求header(Location:...
因為這兩個命令必須在任何瀏覽器請求之前,所以在這種情況下它們現在不起作用,並且符號存在。
現在,Sessions和header
命令可以完美地刪除符號。
我不知道為什么他們在那里,但經過更多測試我發現他們是如何到達那里的:
在Notepad ++中,我可以在菜單中更改編碼格式。 當我從fx ANSI更改為UTF-8時,符號出現了。 在普通的記事本中,我可以在“另存為”窗口中將其保存為UTF-8選項。 在這種情況下,符號也會出現。
在任何情況下,當我通過基於瀏覽器的編輯器查看代碼時,我只能看到符號
,該編輯器直接從服務器獲取文件。 並且編輯總是如此
我對此沒有解釋。 對於另一個SO問題,這可能是一個很好的主題。
感謝所有試圖幫助我的人。 我在這里回答這個問題,因為這就是答案。 但是所有幫助和調試技巧都非常受歡迎並且非常有用。
非常感謝,祝大家夏天愉快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.