重定向后丢失会话变量

时间:2009-12-07 17:14:51

标签: php session

  1. 用户填写用户名和密码。
  2. 如果正确,页面会将一些信息(例如user_id)加载到会话变量中。
  3. 该脚本会进行header('Location')重定向。
  4. 不知怎的,下一页无法识别会话......怎么来的?
  5. 重定向到同一个域,所有页面都有session_start();

    而且我发现它更有可能发生在IE中而不是FF ......奇怪。

6 个答案:

答案 0 :(得分:7)

是否可能未启用Cookie?

为了能够将会话变量与特定客户端实例相关联(即,如何在浏览器和我的浏览器上同时使用会话变量而不会发生冲突),可以使用“会话ID”(或每个会话生成“SID”)。此ID通常以cookie的形式存储在服务器和客户端上。但是,如果未启用cookie,会话ID将作为每个请求中URL的查询字符串的一部分传递,以便服务器可以知道哪个会话ID属于客户端。

当您通过header()调用重定向时,PHP不会自动将SID插入到新请求中,因此您需要自己附加它,格式为:

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

其中SID是PHP定义的常量,包含查询字符串的必要部分(如果存在会话ID,则等效于session_name() . '=' . session_id())。

有关详细信息,请参阅Passing the Session ID

答案 1 :(得分:5)

我遇到了类似的问题,解决方法是在标题(..)重定向下添加 exit(); 指令。

答案 2 :(得分:2)

两个想法:

  1. 在将任何内容发送到浏览器之前,session_start()是否位于脚本的顶部?
  2. 域名是否完全相同? www.mydomain.com重定向到mydomain.com会导致你描述的问题。

答案 3 :(得分:1)

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

只有在我exit()

之下添加header();后才能生效

答案 4 :(得分:0)

WordPress文档指出,如果更改了用户密码,将清除cookie。无论重定向是否发生,这都会导致会话中断。只要您可以阻止cookie被清除(并且exit()可能会像其他答案中所建议的那样),而不是会话应该保留。

  

注意:如果正在更新当前用户的密码,则为cookie   将被清除!

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

答案 5 :(得分:0)

我今天遇到了这个问题,并一直在寻找解决方法。我已经拥有了其他所有人都提到过的内容,无法在任何地方找到答案。

最后,我在使用Firebug观看会话变量后找到了答案。我注意到,在变量丢失的页面上,会话Parameter:secure被设置为true,原因我不知道。

修复在创建会话之前将secure参数设置为false

我使用session_set_cookie_params完成了此操作。像这样:

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