重定向后会话变量丢失
Session variables lost after redirecting
我对此进行了搜索,找到了一些文章,但我的问题并没有解决。
我有一个使用会话变量来检查用户是否登录的登录系统。
当用户登录时,我这样做:
$_SESSION['logged'] = true;
然后重定向到用户页面。
它在某些设备上运行完美,但在某些设备上,当页面重定向时,变量丢失并且用户未登录。
我用它来重定向:
die("<script>window.location = \"..\userpage\"</script>");
可能会出现登录页面的会话问题,因为您在浏览器中打开的 URL 不是唯一的。例如,假设您正在为您的网站创建登录页面,并且您已成功创建会话。现在,如果您从 URL 登录说 http://example.com then your session is limited to this URL only. If you again open the above URL like http://www.example.com (注意两个网址中的 www.),那么您会看到您未登录。因此请确保您的网页始终以 URL 的单一类型打开。虽然两个 URL 都将重定向到相同的目的地,但请将 URL 与 www. 一起使用,或者 不带 www.
有关更多信息,请查看此 post
会话是服务器端的,但它们还需要有关创建它们的用户的信息。为此,通常会使用 cookie。
session_name('ID');
ini_set('session.use_cookies', 1);
session_start();
但是如果您的浏览器不支持 cookie 或用户禁用它们,您的会话将无法工作。您必须将会话作为 URL 查询字符串的一部分手动传递(例如,请参阅 this)
尝试使用
session_write_close()
重定向之前。这可能是一种竞争条件。除此之外,您可能想检查设备上的 cookie 存储,但它无法正常工作——浏览器可能出于某种原因未设置 cookie(也就是说,如果您使用的是 cookie 而不是 url 查询参数, php 也可以实现)。您可能还想查看
上的 cookie 选项
setcookie(...)
尤其是 $secure
和 $httponly
,以防您自己设置 cookie。如果您正在使用该参数,还请确保 $expire
设置为未来日期并采用正确的格式(时间戳)。欲了解更多信息,请参阅
http://php.net/manual/en/function.setcookie.php
另一个原因可能是它不是 device/browser,而是它们连接到互联网的地方。代理可能会缓存响应(那里有一些非常奇怪的代理配置,其中一些忽略 setcookie headers 并且只传递没有这些的缓存页面)这可能是它不起作用的原因。
我能想到的另一件事是您的 session 商店有时不保存 session。默认情况下,大多数 php 安装将 session 保存到文件,然后它们会定期删除。如果分区/挂载点/...已满,则session将不会被保存。如果您查看服务器错误日志(也就是说,如果您在服务器上启用并配置了错误日志记录),您应该能够检查这一点
另一个原因可能是特定浏览器发送了 do-not-track header 信息,出于某种原因,这使得您的服务器不发送 cookie(这将是一个极端的边缘情况,通常情况下大多数服务器只是忽略 do-not-track 信息,但谁知道呢...)
session_start() 应在任何 HTML 标记之前调用。
我对此进行了搜索,找到了一些文章,但我的问题并没有解决。 我有一个使用会话变量来检查用户是否登录的登录系统。 当用户登录时,我这样做:
$_SESSION['logged'] = true;
然后重定向到用户页面。
它在某些设备上运行完美,但在某些设备上,当页面重定向时,变量丢失并且用户未登录。
我用它来重定向:
die("<script>window.location = \"..\userpage\"</script>");
可能会出现登录页面的会话问题,因为您在浏览器中打开的 URL 不是唯一的。例如,假设您正在为您的网站创建登录页面,并且您已成功创建会话。现在,如果您从 URL 登录说 http://example.com then your session is limited to this URL only. If you again open the above URL like http://www.example.com (注意两个网址中的 www.),那么您会看到您未登录。因此请确保您的网页始终以 URL 的单一类型打开。虽然两个 URL 都将重定向到相同的目的地,但请将 URL 与 www. 一起使用,或者 不带 www. 有关更多信息,请查看此 post
会话是服务器端的,但它们还需要有关创建它们的用户的信息。为此,通常会使用 cookie。
session_name('ID');
ini_set('session.use_cookies', 1);
session_start();
但是如果您的浏览器不支持 cookie 或用户禁用它们,您的会话将无法工作。您必须将会话作为 URL 查询字符串的一部分手动传递(例如,请参阅 this)
尝试使用
session_write_close()
重定向之前。这可能是一种竞争条件。除此之外,您可能想检查设备上的 cookie 存储,但它无法正常工作——浏览器可能出于某种原因未设置 cookie(也就是说,如果您使用的是 cookie 而不是 url 查询参数, php 也可以实现)。您可能还想查看
上的 cookie 选项setcookie(...)
尤其是 $secure
和 $httponly
,以防您自己设置 cookie。如果您正在使用该参数,还请确保 $expire
设置为未来日期并采用正确的格式(时间戳)。欲了解更多信息,请参阅
http://php.net/manual/en/function.setcookie.php
另一个原因可能是它不是 device/browser,而是它们连接到互联网的地方。代理可能会缓存响应(那里有一些非常奇怪的代理配置,其中一些忽略 setcookie headers 并且只传递没有这些的缓存页面)这可能是它不起作用的原因。
我能想到的另一件事是您的 session 商店有时不保存 session。默认情况下,大多数 php 安装将 session 保存到文件,然后它们会定期删除。如果分区/挂载点/...已满,则session将不会被保存。如果您查看服务器错误日志(也就是说,如果您在服务器上启用并配置了错误日志记录),您应该能够检查这一点
另一个原因可能是特定浏览器发送了 do-not-track header 信息,出于某种原因,这使得您的服务器不发送 cookie(这将是一个极端的边缘情况,通常情况下大多数服务器只是忽略 do-not-track 信息,但谁知道呢...)
session_start() 应在任何 HTML 标记之前调用。