2009-12-07 133 views
3
  1. 用戶填寫用戶名和密碼。
  2. 如果正確,頁面會將一些信息(如user_id)加載到會話變量中。
  3. 該腳本使header('Location')重定向。
  4. 不知何故,下一頁不會識別會話...怎麼回事?

重定向是同一個域,和所有頁面都session_start();重定向後丟失會話變量

,我發現它在IE發生的可能性比在FF ...奇怪。

+7

你能發表一些代碼嗎? – SilentGhost 2009-12-07 17:17:09

回答

7

有沒有可能沒有啓用cookies?

爲了能夠將會話變量與特定的客戶端實例相關聯(即會話變量如何在瀏覽器和瀏覽器中同時使用而不會發生衝突),「會話ID」(或「SID」)是每個會話生成的。此ID存儲在服務器上,以及客戶端上,通常以cookie的形式存儲。但是,如果cookie未啓用,會話ID將作爲每個請求中URL的查詢字符串的一部分傳遞,以便服務器可以知道會話ID屬於客戶端。

當你通過一個header()呼叫重定向,PHP不會自動插入SID進入了新的要求,所以你需要自己添加它,在形式:

header("Location: my_url.com/my_page.php?" . SID) 

其中SID是一個常數由PHP定義,包含查詢字符串的必要部分(相當於session_name() . '=' . session_id(),如果存在會話ID)。

查看Passing the Session ID瞭解更多詳情。

+0

謝謝你的快速回答。你能解釋一下嗎? 「宣傳SID」是什麼意思?如果這再提示 - 只是發現在本地主機上它工作正常,但在服務器上出現了問題。 – 2009-12-07 17:23:01

+0

我已經更新了我的答案,希望更清楚。 – 2009-12-07 17:28:29

+0

你很清楚。感謝您的幫助。不幸的是,它並沒有幫助,我的cookies也被啓用了,正如我所說的,在本地主機上它很好用。 仍然我無法確定是什麼導致它轉儲會話。 有沒有失去會話變量的麻煩在PHP中重定向的另一種方式? 謝謝! – 2009-12-07 18:46:33

2

兩個想法:

  1. 是在session_start()位於腳本的頂部,任何事情之前發送到瀏覽器?
  2. 域名是否完全一樣? www.mydomain.com重新指向mydomain.com會導致你描述的問題。
5

我剛剛有一個類似的問題,解決的辦法是簡單地添加一個exit();指令根據標題(..)重定向。

+0

這解決了我的問題。 – DudeOnRock 2013-03-19 21:57:37

1
header("Location: my_url.com/my_page.php?" . SID) 
exit(); 

它只是我的header();

0

WordPress的文檔添加下面exit()後曾指出,如果用戶的密碼更改的cookie將被清除。無論是否發生重定向,這都會導致會話中斷。只要您可以防止Cookie被清除(並且exit()可能會這樣做,正如其他答案中所建議的那樣),應該保持會話。

注意:如果當前用戶的密碼正在更新,那麼將清除Cookie !

http://codex.wordpress.org/Function_Reference/wp_update_user

0

我今天有這個問題,一直在尋找一種方式來解決它。我已經有了其他人提到過的內容,並且無法在任何地方找到答案。

最終我在看到我的會話變量Firebug後找到了答案。我注意到在變量丟失的頁面上,會話Parameter:secure由於某種原因而被設置爲true

的修復設置secure參數設置爲false創建會話之前。

我用session_set_cookie_params完成了這個。這樣的事情:

session_set_cookie_params([lifetime], [path], [domain], false, true);