【发布时间】:2010-12-24 02:27:04
【问题描述】:
- 用户填写用户名和密码。
- 如果正确,页面会将
user_id等一些信息加载到会话变量中。 - 脚本进行
header('Location')重定向。 - 不知何故下一页无法识别会话...怎么会?
重定向到同一个域,所有页面都有session_start();
而且我发现它在 IE 中比在 FF 中更容易发生……奇怪。
【问题讨论】:
-
你能贴一些代码吗?
user_id等一些信息加载到会话变量中。header('Location') 重定向。重定向到同一个域,所有页面都有session_start();
而且我发现它在 IE 中比在 FF 中更容易发生……奇怪。
【问题讨论】:
有没有可能是 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。
【讨论】:
我刚遇到类似的问题,解决方法是在 header(..) 重定向下简单地添加一个 exit(); 指令。
【讨论】:
两个想法:
【讨论】:
header("Location: my_url.com/my_page.php?" . SID)
exit();
它只有在我在header(); 下方添加exit() 后才有效
【讨论】:
WordPress 文档指出,如果更改用户密码,cookie 将被清除。无论是否发生重定向,这都会终止会话。只要您可以防止 cookie 被清除(并且 exit() 可能会这样做,正如其他答案中所建议的那样),会话就应该保留。
注意:如果当前用户的密码正在更新,那么cookies 将被清除!
http://codex.wordpress.org/Function_Reference/wp_update_user
【讨论】:
我今天遇到了这个问题,一直在寻找解决方法。我已经有了其他人提到的内容,无法在任何地方找到答案。
最终我在用Firebug 观看了我的会话变量后找到了答案。我注意到在变量丢失的页面上,会话 Parameter:secure 被设置为 true,原因我不知道。
修复方法是在创建会话之前将secure 参数设置为false。
我使用session_set_cookie_params 完成了这项工作。像这样的:
session_set_cookie_params([lifetime], [path], [domain], false, true);
【讨论】: