我搜索了这个,我找到了一些文章,但我的问题没有解决。 我有登录系统使用会话变量来检查用户是否登录。 当用户登录时,我执行:
$_SESSION['logged'] = true;
然后重定向到用户页面。
它在某些设备上运行良好,但在页面重定向时,某些设备处于调整状态,变量丢失且用户未登录。
我用它来重定向:
die("<script>window.location = \"..\userpage\"</script>");
答案 0 :(得分:1)
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(这将是一个极端的边缘情况,因为通常大多数服务器只是忽略了 - 不跟踪信息,但谁知道......)