【问题标题】:Losing session variables after redirect重定向后丢失会话变量
【发布时间】:2010-12-24 02:27:04
【问题描述】:
  1. 用户填写用户名和密码。
  2. 如果正确,页面会将user_id等一些信息加载到会话变量中。
  3. 脚本进行header('Location') 重定向。
  4. 不知何故下一页无法识别会话...怎么会?

重定向到同一个域,所有页面都有session_start();

而且我发现它在 IE 中比在 FF 中更容易发生……奇怪。

【问题讨论】:

  • 你能贴一些代码吗?

标签: php session


【解决方案1】:

有没有可能是 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。

【讨论】:

  • 感谢您的快速答复。你能解释一下吗? “传播 SID”是什么意思?如果这更清楚 - 刚刚发现在 localhost 中它工作正常,但在服务器上出现问题。
  • 你很清楚。谢谢您的帮助。不幸的是,它没有帮助,我的 cookie 已启用,正如我所说,在 localhost 上效果很好。我仍然无法弄清楚是什么导致它转储会话。是否有另一种在 PHP 中进行重定向而不会丢失会话变量的方法?谢谢!
  • 我用头撞墙,直到我检查我的 cookie 是否启用。感谢提示1
【解决方案2】:

我刚遇到类似的问题,解决方法是在 header(..) 重定向下简单地添加一个 exit(); 指令。

【讨论】:

    【解决方案3】:

    两个想法:

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

    【讨论】:

    • 我有第二种情况,我必须重定向到子域如何处理?
    【解决方案4】:
    header("Location: my_url.com/my_page.php?" . SID)
    exit();
    

    它只有在我在header(); 下方添加exit() 后才有效

    【讨论】:

    • 你好,我可能想错了,但是如果 PHP 是逐行解释器,如果 url 被重定向,exit() 将如何执行,并且不返回?
    【解决方案5】:

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

    注意:如果当前用户的密码正在更新,那么cookies 将被清除!

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

    【讨论】:

      【解决方案6】:

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

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

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

      我使用session_set_cookie_params 完成了这项工作。像这样的:

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

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2014-08-14
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多