我一直在尝试维护两个子域之间的 session 变量,但发现这是不可能的。我最终创建了 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();
我发现我在每种情况下都得到了相同的结果。 session 不跨子域进行,页面测试 2 不知道我将 $_SESSION['test'] 设置为什么值。然而,网络上似乎有足够的把握表明上述方法之一应该有效。知道会发生什么,特别是因为我使用最少的页面来测试该机制(我看不到任何副作用)?顺便说一下,我在共享服务器上,如果这是相关的话。
谢谢你的想法。弗兰克。
编辑。 我修好了。这个问题是由 Suhosin 引起的。请参阅本页底部的详细答案。
最佳答案
好吧,我搞定了,它很臭。
Suhosin 的 suhosin.session.cryptdocroot 选项是问题的全部原因。当 session 加密 key 基于 DocRoot 时,当基域和子域从不同的目录提供服务时,它会导致子域无法看到彼此的 session 变量。这导致服务器上的 session 变量存储在不同的文件夹中,因此它们对每个相应的域都不可见。
解决方案。只需将这两行添加到您的 php.ini 文件中:
suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off
追踪 48 小时的噩梦,修复 4.8 秒。
关于php - 跨子域维护 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9317595/