【问题标题】:Transfer Session Data Between Apache Virtual Hosts在 Apache 虚拟主机之间传输会话数据
【发布时间】:2011-05-12 01:43:42
【问题描述】:

如何将 PHP 会话数据从一个 Apache 虚拟主机传递到另一台?我目前正在运行 Apache 2.2.17 和 PHP 5.3.3,并且我已经设置了一个主机来管理一个单点登录应用程序,我需要将它传递给运行单独应用程序的另外两个虚拟主机。这是我打算进一步开发的东西,但目前传递会话数据将是最简单的。

目前此代码在 SSO 子域 auth.domain.com 中创建第一个会话,然后将用户传递回应用程序界面 app.domain.com(已被修剪):

  $user = new User;
  $user->set_user_session();
  Header("Location: $redirectURL");
  exit;

服务器完全由私人管理,因此无需担心多用户安全性。但是,如果有人发现除此之外的任何安全问题,请告诉我。如果您知道更好的方法,请分享,我将进一步研究。感谢您的帮助。

【问题讨论】:

    标签: php apache session-variables


    【解决方案1】:

    据我所知,PHP 会话(默认情况下)不支持虚拟主机:您​​需要将会话 ID 作为重定向的一部分传递,然后将其设置在其他虚拟主机中。所以像:

    $sessionid = session_id();
    Header("Location: $redirectURL?session=$sessionid");
    exit;
    

    然后在重定向的目标中:

    session_id($_GET['session']);
    session_start();
    

    尝试一下,然后告诉我它是如何工作的。

    【讨论】:

    • 当然:您必须确保在访问任何会话数据之前拨打了session_id($_GET['session']); 电话。
    • 我已经能够更改会话 ID,但由于某种原因我无法访问会话变量。通过 echo'ing session_id() 确认,但是当我尝试回显 $_SESSION[] 变量时,它没有设置。任何会影响此的 PHP 设置?
    • 除非我错了 session_id() 更改必须在访问 $_SESSION 的任何其他事情之前发生,否则它将不起作用。另外,我假设您没有在 http 和 https 之间移动,因为有时这不太正确。
    • 已确认:在任何会话函数或变量之前调用 session_id()。还确认:也没有 HTTP/S 切换。
    • 啊:每个虚拟主机是在不同的用户 ID 下运行,还是在相同的用户 ID 下运行?如果它们不同,那么您可能会遇到文件权限错误:否则,我真的很难过,因为通常没有任何其他原因导致一个人不应该找到另一个人的会话。
    【解决方案2】:

    共享会话 如果您正在谈论子域(未指定),您可以将 cookie 域设置为仅域,以便会话 ID 作为 cookie 在它们之间传递

    session_set_cookie_params(0, '', '.domain.com');

    所以,my.domain.comyour.domain.com 都会获得 .domain.com 的 cookie

    使用任一选项,您都可以使用共享数据库或 redis 存储来进行共享会话管理。 (通过会话存储在服务器之间共享数据)

    只要所有 VMS 的会话存储配置相同。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2011-06-19
      • 2012-04-03
      • 2019-08-25
      • 2012-04-26
      • 2012-09-25
      • 2011-03-25
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多