标头后PHP会话被破坏/丢失
Posted
技术标签:
【中文标题】标头后PHP会话被破坏/丢失【英文标题】:PHP session destroyed / lost after header 【发布时间】:2011-01-03 11:38:39 【问题描述】:我有一个脚本,它在使用header()
重定向到/
之前设置一些会话值。
我已经阅读了很多关于 $_SESSION
变量在 header()
之后被破坏/丢失的帖子,即使在我实现了这个之后:
// set session here
session_regenerate_id(true);
session_write_close();
header("Location: /");
session_start()
设置在正确的位置,有人知道我可能遗漏了什么吗?
在 index.php 页面上我有这个:
session_start();
print_r($_SESSION);
// outputs nothing :'(
代码比较复杂,就不一一贴出来了,sn-ps就好了。
【问题讨论】:
【参考方案1】:我从未见过由于使用位置标头而导致的任何会话相关问题 - 您确定在两个页面上都调用 session_start 吗?
嗯...在您添加上面的 session_start 位之前,这个答案更有意义,并提到了您确定您正在使用 session_start 的事实。 :-)
【讨论】:
即使删除session_regenerate_id
行后,同样的问题仍然存在。
是的,我确信 session_start()
在所有正确的地方都被调用了。
如果您取出标头位置重定向并简单地更改 URL(在浏览器中),会话数据是否可用?
Hmmmm...它仍然没有设置,也许这不是header()
的问题?
我建议使用 session_start 尽可能接近任何 PHP 包含的开头,并使包含在所有页面上的第一项(即:pre doctype/html headers 等)。
【参考方案2】:
必须在会话关闭前发送标头
session_regenerate_id(true);
header("Location: /");
// the header must be sent before session close
session_write_close(); // here you could also use exit();
【讨论】:
我遇到了同样的问题,在重定向解决后添加了“exit()”【参考方案3】:只需退出;在标题之后:D 我解决了这个
【讨论】:
【参考方案4】:Header 重定向后需要退出 PHP 脚本:
header("Location: /");
exit();
【讨论】:
由于exit
是一种语言结构,您可以只使用exit;
(无括号)。只是一个有用的提示来保存 2 个字符的代码。 :-)【参考方案5】:
为了结束这个问题,我们已经得出结论,这是服务器配置的问题,考虑到主机以这种事情而闻名,这并不奇怪。
【讨论】:
你能说得更准确点吗? 不,很遗憾我不能。当时的主机不允许开发者修改php.ini
文件,移动到我们可以控制的不同主机,问题就解决了。
对于任何阅读本文的人,我想我可能有解决方案。这是***.com/questions/17242346/… 上发布的公认答案【参考方案6】:
这里没有提到但发生在我身上的一个可能选项是我正在创建另一个会话。当您在 php 中使用会话时,您一次只能使用一个会话。如果您创建一个新会话,旧会话将丢失。当您为登录创建会话并且可能需要另一个会话以进行其他操作时,这种情况更有可能发生(无论如何都不推荐)。我的案例是一个 flash() 方法,我只在添加/更新/删除帖子后才使用它来创建会话。并在视图中使用该会话来显示一条消息,然后将其销毁。每次我在添加/更新/删除我用于登录的另一个会话时创建一个新会话时都会被破坏。这不是经常发生的事情,但有可能。
【讨论】:
评论:我不明白。我不是母语英语,但你的句子让我感到困惑。是否需要一些带有代码块的文本格式? @H.Hasenack 是的,我同意你的观点,这是一个简短的回答,可以从中理解任何内容。所以我编辑并扩展了它。希望现在更有意义。【参考方案7】:您不需要在每个页面中启动 session_start()。因为在您的浏览器关闭之前,您在 php.ini 中指定的整个路径都会保留相同的会话
【讨论】:
以上是关于标头后PHP会话被破坏/丢失的主要内容,如果未能解决你的问题,请参考以下文章