【问题标题】:Why does PHP not keep session between pages?为什么 PHP 不保持页面之间的会话?
【发布时间】:2011-04-19 17:33:44
【问题描述】:

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

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

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

我的登录脚本是这样工作的:

  • 用户请求页面
  • 如果用户没有通过身份验证,他会被扔回登录页面
  • 如果用户通过了身份验证,他将获得一个带有个人资料数据的 $_SESSION["auth"]
  • 然后当用户在浏览主页面或其他需要认证的页面时,他们只需检查是否设置了 $_SESSION["auth"]。

关于如何解决这个问题的任何提示?

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

【问题讨论】:

  • 如果将代码添加到丢失会话数据的页面<pre><?php print_r($_SESSION); ?></pre>,您会看到什么,换句话说;会话转储?
  • print_r($_SESSION);写入一个空字符串
  • 当您说第一个“作为服务器运行”时,您的意思是作为 NT 服务吗?如果是这样,运行 services.msc 并检查命令行;您用于在控制台运行服务器的命令应该非常相似。我认为作为 NT 服务运行的 apache 可能有一个额外的开关,但时间太长我不记得它是什么了。
  • '-k runservice' 没有别的。

标签: php session apache2


【解决方案1】:

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

【讨论】:

  • 我从 https://domain.com/login 重定向到 https://domain.com/profile,两个链接都被 mod_rewrite 重写为 https://domain.com/index.php。
  • 听起来这不是你的问题。尽管如此,仔细检查存储的 cookie 路径并确保它们都设置为 root 并没有什么坏处。
  • 已检查。两者都设置为root。请记住,我有相同的 PHP 代码在另一个 apache 上顺利运行,所以我不希望这是我的代码的问题。 Prolly 一个 windows、apache 或 php 设置问题。
  • 可能是这样...您可以尝试比较print_r($_SERVER)phpinfo() 的输出,看看两台服务器之间是否存在明显差异...
  • 此时只是在黑暗中拍摄,但是如果您在没有运行 NT 服务的情况下自行运行它,服务器是否在控制台上运行?也许配置too 相同,就像它们使用相同的 httpd.conf 或端口之类的?或者,为什么不尝试将两个服务器都安装为 NT 服务?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多