2009-12-07 116 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);