会话变量在 PHP5/Apache2/Ubuntu12 中不持久

会话变量在 PHP5/Apache2/Ubuntu12 中不持久

我有一个网站,它使用会话变量(在 PHP 中)来了解访问者是否正在进入网站。如果他是新用户,那么我会将他重定向到检测到的语言。但如果他不是新用户,你就让他去他想去的任何地方(即使是其他语言的页面)。

问题在于,用于实现此目的的变量 ($_SESSION["knownvisitor"]) 不是持久的。我在其他服务器上测试了同一个网站,它运行良好,所以我很确定这是一个会话配置问题。有问题的服务器是 Ubuntu Server 12.04.4,带有 Apache 2.2.22 和 PHP 5.3.10。

会话存储在“/var/lib/php5”中,我可以看到那里的文件,但它们是空的。会话文件属于“www-data”,并具有以下权限“-rw-------”。另一方面,目录属于“root”,并具有以下权限“drwx-wx-wt”。

我尝试在重定向之前使用“session_write_close()”,就像一些论坛推荐的那样,但没有成功。重定向类似于“header('Location: [URL]')”。

以下是脚本的代码,您可以了解其基本行为。这是我放在网站所有文件开头的内容:

function detectedlang($availlangs)
{
 // FUNCTION STUFF HERE TO FIND OUT WHICH IS THE LANGUAGE OF THE VISITOR
 return $detectedlang;
}

session_start();

if (!isset($_SESSION["knownvisitor"]))
{
 $detectedlang = detectedlang(array("en", "es"));
 $_SESSION["knownvisitor"] = true;
 header("Location: http://www.mysite.com/".$detectedlang);
}

答案1

您说的/var/lib/php5/session是 拥有root并具有权限drwx-wx-wt。这意味着所有用户都可以到目录,但只有 root 可以。结果是 PHP 可以创建会话文件,但无法返回并稍后读取它们。这似乎是您的会话失败的原因。

修复所有权和权限,以便www-data可以读取和写入(rwx)。例如:

chgrp www-data /var/lib/php5/session
chmod g+rwx /var/lib/php5/session

相关内容