重定向后会话变量丢失

时间:2015-03-29 08:42:10

标签: php session session-variables

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

$_SESSION['logged'] = true;

然后重定向到用户页面。
它在某些设备上运行良好,但在页面重定向时,某些设备处于调整状态,变量丢失且用户未登录。

我用它来重定向:

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

4 个答案:

答案 0 :(得分:1)

应该在任何HTML标记之前调用

session_start()。

答案 1 :(得分:0)

可能会出现登录页面的会话问题,因为您在浏览器中打开的URL不是唯一的。例如,如果您要为网站创建登录页面,并且已成功创建会话。现在,如果您从网址登录,请说 http://example.com ,那么您的会话仅限于此网址。如果您再次打开上述网址,例如 http://www.example.com (请注意两个网址中的www。),那么您会看到您尚未登录。所以请成为确保您的网页始终以单一类型的网址开放。虽然两个网址都会重定向到同一个目的地,但请使用网址 www。不使用www。 有关详情,请查看此post

答案 2 :(得分:0)

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

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

但是如果您的浏览器没有提供cookie或用户禁用它们,那么您的会话将无法正常工作。您必须手动传递会话作为URL查询字符串的一部分(例如,请参阅this

答案 3 :(得分:-1)

尝试使用

session_write_close()

重定向之前。它可能是一种竞争条件。除此之外,您可能希望在设备无法正常工作的设备上查看Cookie商店 - 浏览器可能因某些原因未设置Cookie(即,如果您使用的是Cookie而不是网址查询参数,这也是可能的PHP)。您可能还想检查

上的cookie选项
setcookie(...)

尤其是$secure$httponly,以防您自行设置Cookie。如果您正在使用该参数,请确保将$expire设置为将来的日期并使用正确的格式(时间戳)。有关详细信息,请参阅

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

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

我能想到的另一件事是你的会话商店有时不会保存会话。默认情况下,大多数php安装会将会话保存到文件,然后定期删除它们。如果分区/挂载点/ ...已满,则不会保存会话。如果您查看服务器错误日志(即,如果您在服务器上启用并配置了错误日志记录),您应该能够检查这一点。

另一个原因可能是特定的浏览器发送了do-not-track标头信息,并且由于某种原因这会使你的服务器不发送cookie(这将是一个极端的边缘情况,因为通常大多数服务器只是忽略了 - 不跟踪信息,但谁知道......)