【问题标题】:Maintaining Session Variables across Subdomains跨子域维护会话变量
【发布时间】:2012-03-08 05:22:22
【问题描述】:

我一直在尝试维护两个子域之间的会话变量,但发现这是不可能的。我最终创建了 2 个最小的 PHP 网页作为测试平台,我称之为“测试 1”的只是设置了

$_SESSION['test'] = "Fred";

并有一个指向“test 2”的超链接,它只是尝试回显 $_SESSION['test'] 的值来证明它是否有效。我将“测试 1”放在我的 www 域中,将“测试 2”放在我的子域中。我尝试了来自各种来源的标题中应该包含的各种版本。以下是主要的 3 个(当然还有它们的变体):

ini_set('session.cookie_domain',substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
session_start();

或

ini_set('session.cookie_domain','mydomain.com');
session_start();

或

ini_set('session.cookie_domain', PHP_INI_ALL);
session_start();

或

session_set_cookie_params(0, "/", ".mydomain.com", false);
session_start();

我发现在每种情况下我都会得到相同的结果。会话不会跨子域进行,并且页面测试 2 不知道我将 $_SESSION['test'] 设置为什么值。然而,网上似乎有很多确定性,即上述方法之一应该有效。知道会发生什么,特别是因为我使用最少的页面来测试机制(我看不到任何副作用)?顺便说一句,我在共享服务器上,如果这在这里相关的话。

感谢您的想法。弗兰克。

编辑。 我修好了。问题是由 Suhosin 引起的。请参阅本页底部的详细答案。

【问题讨论】:

    标签: php session-variables session-cookies subdomain


    【解决方案1】:

    好吧,我搞定了,结果很糟糕。

    Suhosin 的 suhosin.session.cryptdocroot 选项是问题的全部原因。当会话加密密钥基于 DocRoot 时,当基域和子域从不同目录提供服务时,它会导致子域无法看到彼此的会话变量。这导致服务器上的会话变量存储在不同的文件夹中,因此它们对每个相应的域都不可见。

    解决方案。只需在 php.ini 文件中添加这两行:

    suhosin.session.cryptdocroot=Off
    suhosin.cookie.cryptdocroot=Off
    

    48 小时噩梦追查,4.8 秒修复。

    【讨论】:

    • “追查 48 小时噩梦,4.8 秒修复” - 超级棒。我理解你:)
    【解决方案2】:

    我有它的工作,设置会话名称和会话 cookie 参数:

    $some_name = session_name("some_name");
    session_set_cookie_params(0, '/', '.some_domain.com');
    session_start();
    

    【讨论】:

    • 谢谢。我尝试命名会议 - 不高兴。不过,我现在确实有更多信息。我尝试了 php.net 文档中建议的测试并添加了以下内容: $some_name = session_name("some_name"); $blnResult = ini_set("session.cookie_domain", ".mydomain.com"); session_start(); if (empty($blnResult) or (!$blnResult)) { echo "设置不能设置";出口;我发现返回结果说它没有被设置!知道为什么会这样吗?
    • @Frank Anderson 我没有尝试过ini_set 方法,只是session_set_cookie_params 一种。
    • 谢谢杰罗恩。我犯了一个笨拙的错误,但现在我更正了,是的,我现在完全按照您在此处的建议使用了设置。 Session Var 的值仍然不会传输到“接收”页面,只要它位于子域中。还有什么可能,或者我可以尝试其他哪些诊断来找出发生了什么?
    • 注:我使用 session_id() 检查并发现我实际上在两个页面上都有相同的会话 ID - 更奇怪的是 Session Var 在第二页上没有任何价值!有什么想法吗?
    • @Frank Anderson 当您在两个页面上都使用var_dump($_SESSION); 时,您看到了什么,结果完全不同吗?
    猜你喜欢
    • 2015-11-22
    • 2011-02-09
    • 2023-03-14
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2011-05-20
    相关资源
    最近更新 更多