php - 跨子域维护 session 变量

标签 php session-variables session-cookies subdomain

我一直在尝试维护两个子域之间的 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/

相关文章:

php - in_array() 和多维数组

php - while循环不适用于多个变量php?

php - 捕获用户数据以进行机器学习和推荐

php - 从请求中排除 Laravel 特定的值

php - 拉维尔 5.3 : Use auth/middleware on custom error page

php - 应该使用哪种技术来测试 PHPUnit 中的抽象类功能?

django - 测试 session 变量

c# - 一个全局变量,用于存储当前 session 中的当前用户数据

python - Django session 变量重置

node.js - 使用 iisnode 时保护 CookieSession