我做了一个简单的注册页面,在验证之后,会话会话ID添加一个唯一的标识符来识别用户,并设置会话变量' UID'自定义值。然后脚本重定向到新页面。
$_SESSION['UID'] = $id;
session_id($sessID);
echo session_id();
session_write_close();
header("Location: https://localhost/AccountWebsite/landing.php");
exit();
?>
着陆页应该只能由成员(即我的脚本设置了特殊唯一会话ID的成员)访问,并且该功能不起作用。因此,要检查为什么,目前我允许任何人访问该页面并且他们的会话ID被回应,那么' UID'会话变量。
<?php
session_start();
echo session_id()."\n";
echo $_SESSION['UID'];
?>
现在,当我回复身份时,它不是我自己设定的那个。它是通用的PHP,并且变量不存在。在调试过程中,我在注册脚本中注释掉了重定向,而是让它回显它刚刚设置的会话ID。回显的id是正确的(很明显,因为它在它设置的脚本中回显),尽管当我在Firefox上输入cookie管理器时,它会将会话ID显示为通用的php,这意味着会话在第一个脚本结束时重置,不在会话之间。
- 确保session_start();在任何会话出现之前调用 调用。所以一个安全的赌注就是把它放在你的开头 页面,在打开php标签之后立即执行任何其他操作。 还要确保在打开php之前没有空格/制表符 标签
- 在标题重定向之后,使用exit()结束当前脚本; (其他人也建议使用session_write_close();和 session_regenerate_id(true),您也可以尝试这些,但我会使用 出口();)
- 确保在您用于测试的浏览器中启用了Cookie。
- 确保register_globals已关闭,您可以在php.ini文件中查看,也可以使用phpinfo()。有关如何将其关闭的信息,请参阅此处。
- 确保您没有删除或清空会话
- 确保$ _SESSION超全局数组中的键不会被覆盖
- 确保您重定向到同一个域。因此,从www.yourdomain.com重定向到yourdomain.com并不会进行会话 前进。
- 确保您的文件扩展名为.php(它会发生!)
醇>
我从dayuloli's answer on this post完成了上述所有操作 并且整天都在调试。请帮忙,为什么会话没有保留我在脚本结束时设置的id和变量值并sccross整个服务器?
附加信息:我尝试了另一个示例文件夹(在htdocs上),其中一个页面设置一个变量而另一个页面回应它,并且它起作用。
答案 0 :(得分:1)
除非您想要多个会话,否则您不需要设置session_id。如果您确实指定了session_id,则需要先调用session_start()以开始使用它并将cookie提交到客户端的浏览器中。
除了该解释之外,您还需要在需要会话的任何脚本的顶部使用session_start()。
来自http://php.net/manual/en/function.session-id.php:
需要在session_start()之前调用session_id() 当session_start()为时,
session_id()将始终发送新的cookie 称为