为什么PHP不在页面之间保持会话?

时间:2010-10-01 07:34:49

标签: php session apache2

我有一个带有apache2的Windows服务器2008。服务器有2个光盘,我在两个上运行一个apache实例。第一个作为服务在命令行中作为第二个运行。他们都在自己的htdocs文件夹中使用相同webroot的精确副本。此外,它们都使用位于第一张光盘上的相同PHP安装(Program Files(x86))。我的应用程序通过SSL运行并使用PHP和MySQL。

作为服务运行的Web服务器可以正常运行我的应用程序并让我登录并始终准备好会话数据。然而,第二台服务器让我运行我的登录脚本,在运行脚本时有会话数据,但在重定向到同一webroot内的另一个页面后丢失了该会话数据。

第二个网络服务器上的问题类似于this question,但每个页面上都有session_start()。

我的登录脚本的工作原理如下:

  • 用户请求页面
  • 如果用户未通过身份验证,则会将其返回登录页面
  • 如果用户已通过身份验证,则会使用其个人资料数据获得$ _SESSION [“auth”]
  • 然后,当用户浏览主页面或需要身份验证的其他页面时,他们只会检查是否设置了$ _SESSION [“auth”]。

有关如何解决此问题的任何提示?

编辑: 一个小小的澄清。我在每个页面上都有会话ID。当我被重定向时,该ID不会改变。我在重定向到的页面上的$ _SESSION变量中没有任何数据。

3 个答案:

答案 0 :(得分:1)

查看存储会话文件的php会话目录的权限。如果php没有写入,创建和更改文件的权限,您将无法在$ _SESSION var中存储任何内容。

答案 1 :(得分:1)

我找到了解决方案。运行Web服务器的用户确实拥有httpd.conf中所有路径的权限,但没有权限访问PHP.ini中的所有路径。 session.save_path是其中一条路径,如果无法存储会话数据,则服务器无法访问会话数据。

session.save_path设置为C:\ Windows \ Temp,最初我认为除了apache dirs,php dirs和webroot之外,我不认为必须授予任何权限。

感谢您的帮助!

答案 2 :(得分:0)

如果用户访问您网站根目录的子路径,然后向上导航,会话将中断。这是因为cookie只会为该路径设置,而不是整个域。更多信息:http://www.php.net/manual/en/function.session-start.php#91298