簡體   English   中英

會話和php重定向不起作用

[英]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'])語句。

這個問題

到現在為止還挺好。 這告訴我腳本能夠檢測到會話未設置。
剩下的兩個問題是:

  • 為什么語句中的重定向不起作用,因為沒有重定向發生,並且
  • 為什么不能首先設置會話。

任何建議將被認真考慮。


更新1

為了清楚說明發生了什么(以及什么不發生),我在不同的地方放了一些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重定向顯然沒有做任何事情。


更新2

所以,感謝下面@EmilF的回答,我發現我的會話ID - 我可以用echo session_id();打印到屏幕上echo session_id(); - 每次頁面轉換或頁面刷新時的更改似乎是一些新的隨機數。 我看起來好像存儲在會話中的數據被遺忘了,因為新的會話ID指向其他地方。

通過使用:

<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...

其中cutckilc16fm3h66k1amrrls96只是一個隨機數,會話ID是固定的,現在可以在頁面刷新后再次檢索存儲的數據。 這非常有效; 雖然有點奇怪但是有必要。

現在我只需要頭重定向工作......

嗯,這聞起來像是被關閉的東西。 會話和標頭功能已更改。 也許這是來自主機的一些PHP設置。 阻止標頭請求的東西。

未完待續...

更新3 - 解決了

請參閱下面的答案。

當我將文件更改為另一種編碼格式時,例如從ANSI到UTF-8,會在文件的開頭創建一些奇怪的符號。 創建的符號是 ,我無法在自己的編輯器中看到它們。 因為它們位於php腳本的前面,所以它們會阻止headersession_start()以正常方式工作。 為什么它們被創造出來對我來說仍然是一個謎。

哦,讓我們列出你可以在這里調試的所有內容,還提到你已經做過的事情(所以其他人可以閱讀):

  • 你有安裝HTTP Header之類的東西嗎? 然后,您可以查看是否將Location:標頭發送到您的瀏覽器。
  • 我想你沒有收到任何錯誤信息,對嗎? 你設置了error_reporting(E_ALL);
  • 嘗試為$_POST數組執行var_dump()
  • 您還有什么東西可以在瀏覽器中查看cookie嗎? 我通常使用Firefox web-developer工具欄插件 ,它有一個菜單Cookie - >顯示cookie信息 在那里你應該看到一個PHPSESSID cookie(登錄后)。 如果沒有,您的URL應包含有關會話ID的一些信息(如下所示: ?PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4 )。 否則,PHP無法找到會話,因為它不知道哪個會話屬於您。

如果這無助於檢查cookie是否已設置:

  • 再次打開標題插件 ,然后執行登錄。 檢查服務器是否向您發送cookie。 這必須在Set-Cookie命令中完成。 它可能如下所示: Set-Cookie: PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4; path=/ Set-Cookie: PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4; path=/
  • 如果服務器沒有設置cookie,請檢查php.ini的設置。 必須設置session.use_cookies = 1 ,必須設置為1On以允許PHP使用cookie。
  • 如果服務器確實設置了cookie,但您的瀏覽器不允許,請檢查瀏覽器的cookie選項。 另請檢查session.use_only_cookies = 0php.ini設置。 如果設置為1 ,則禁止PHP使用URL,如果瀏覽器不接受cookie。 出於安全原因,這通常是被禁止的,因為人們將URL復制到朋友,然后這些朋友將接管登錄的會話;)所以只需將其設置為0以進行調試。
  • var_dump() session_start()的返回值。 如果PHP無法正確啟動會話,它將返回false。

神秘在這里解決了: 字節順序標記

在此輸入圖像描述

你會發現最佳答案:

https://stackoverflow.com/a/8028987/424004

嘗試使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM