重定向一个脚本后,PHP会话值丢失,但在另一个脚本重定向后保留

时间:2010-05-25 03:59:31

标签: php session header

在我的注册脚本中,我有:

// Save registration information into the database

// Set sessions
$_SESSION['var1'] = 'somevalue';
$_SESSION['var2'] = 'anothervalue';

header('Location: /somewhere');
exit();

然后在我的登录脚本上我有:

// Check if user provided correct login credentials
if (correct) {
    $_SESSION['var1'] = 'somevalue';
    $_SESSION['var2'] = 'anothervalue';
}

header('Location: /somewhere');
exit();

发生的事情是会话变量在注册脚本中的头重定向之后丢失,但是在登录脚本中重定向之后它们被保留了。

我在两个页面都检查了session_id()并且它们具有相同的值,在每个页面的顶部都包含session_start(),并且基本上尝试了在Stackoverflow上发现的这个常见问题的解决方案但是似乎没什么好看的工作。

我开始怀疑它是否与我的服务器配置而不是我的代码有关。

5 个答案:

答案 0 :(得分:1)

您是在www.example.com和example.com之间重定向吗?因为这是两个不同的领域。

答案 1 :(得分:1)

有关session_write_close的手册页有来自此类或类似问题的很多人的评论。有人说通过在“header('location”行)之前调用session_write_close来修复它。

这篇文章:http://us.php.net/manual/en/function.session-write-close.php#86791

他说这对他不起作用,但调用session_regenerate_id()确实有效。 (这会更改会话cookie,并强制php发送cookie。

可能需要再次发送cookie。我读过一些人说有些浏览器在重定向后不发送cookie,除了他们刚刚在原始网址上获得的cookie。

答案 2 :(得分:0)

我意识到这是一个旧线程,但我只是将一个站点移动到一个带有证书的新专用IP,并且会话不会传递一个标题(“location:”)重定向...在旧位置它们是过得很好。唯一有用的是添加session_regenerate_id(true);在重定向之前。我还好奇为什么?那里有什么想法吗?

答案 3 :(得分:0)

我遇到了同样的问题,之后我尝试了一切:

exit();

session_write_close();

$_SESSION['user'] = $user;session_register("user");

session_start();

页面中所有可能的几何位置

最后......我发现在我的配置中,会话保存路径的文件夹不可写。

一旦设置为可写并设置了正确的用户,一切都像魅力一样。

要查找保存路径,请查看 phpinfo() session.save_path

下的内容

答案 4 :(得分:-3)

为什么要使用exit()?标题(“location:/ somewhere”);将阻止脚本的其余部分被执行。