重定向后会话变量丢失


Session variables lost after redirecting

我搜索了一下,找到了一些文章,但我的问题没有解决。我有一个登录系统,它使用会话变量来检查用户是否登录。当用户登录时,我会:

$_SESSION['logged'] = true;

然后重定向到用户页面
它在一些设备上运行得很好,但在某些设备上,当页面重定向时,变量会丢失,用户不会登录。

我用这个重定向:

die("<script>window.location = '"..'userpage'"</script>");

session_start()应该在任何HTML标记之前调用。

登录页面的会话问题可能是因为您在浏览器中打开的URL不是唯一的。例如,假设您正在为您的网站创建登录页面,并且您已成功创建会话。现在,如果您是从URL登录,请说http://example.com则您的会话仅限于此URL。如果您再次像那样打开上述URLhttp://www.example.com(注意两个URL中的www.),然后您将看到您没有登录。因此,请确保您的网页始终以单一类型的URL打开。尽管两个URL都将重定向到相同的目的地,但请使用www没有www.欲了解更多信息,请查看此帖子

会话是服务器端的,但它们也需要创建会话的用户的信息。为此,通常使用cookie。

session_name('ID'); 
ini_set('session.use_cookies', 1);
session_start();

但是,如果您的浏览器不支持cookie或用户禁用了cookie,您的会话将无法工作。您必须手动将会话作为URL查询字符串的一部分(例如,请参阅此)

尝试使用

session_write_close()

重定向之前。这可能是一种种族状况。除此之外,您可能需要检查设备上的cookie存储,因为它不工作-浏览器可能出于某种原因没有设置cookie(也就是说,如果您使用的是cookie,而不是url查询参数,php也可能使用这种参数)。您可能还想检查上的cookie选项

setcookie(...)

尤其是$secure$httponly,以防您自己设置cookie。此外,如果使用该参数,请确保$expire设置为未来日期,并且格式(时间戳)正确。有关更多信息,请参阅

http://php.net/manual/en/function.setcookie.php

另一个原因可能是不是设备/浏览器,而是它们连接到互联网的地方。代理可能会缓存响应(有一些非常奇怪的代理配置,其中一些会忽略setcookie头,只传递没有这些头的缓存页面),这可能是它不起作用的原因。

我可以想到的另一件事是,您的会话存储有时不会保存会话。默认情况下,大多数php安装都将会话保存到文件中,然后定期删除它们。如果分区/装入点/。。。已满,会话将不会保存。如果你查看了服务器错误日志(也就是说,如果你在服务器上启用并配置了错误日志),你应该能够检查这个

另一个原因可能是特定的浏览器发送了不跟踪标头信息,出于某种原因,这会使您的服务器不发送cookie(这将是一种极端的边缘情况,因为通常大多数服务器都会忽略不跟踪信息,但谁知道呢…)