PHP 会话在标头后被破坏/丢失

问题描述 投票:0回答:9

我有一个脚本,可以在使用

/
重定向到
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 :'(

代码相当复杂,因此不会全部发布,仅发布片段。

php session header
9个回答
12
投票

我从未见过因使用位置标头而导致的任何会话相关问题 - 您确定在两个页面上都调用 session_start 吗?


嗯...在您添加上面的 session_start 位之前,这个答案更有意义,并提到您确定您正在使用 session_start 的事实。 :-)


5
投票

标头必须在会话关闭之前发送

session_regenerate_id(true);

header("Location: /");
// the header must be sent before session close
session_write_close(); // here you could also use exit();

4
投票

为了结束这个问题,我们得出的结论是服务器配置有问题,考虑到主机以此类事情而闻名,这并不奇怪。


4
投票

只需退出即可;标题之后:D 我用这个解决了


4
投票

标头重定向后,您需要退出 PHP 脚本:

header("Location: /");
exit();

0
投票

这里没有提到但发生在我身上的一个可能的选择是我正在创建另一个会话。当您在 php 中使用会话时,一次只能使用一个会话。如果您创建新会话,旧会话就会丢失。当您创建一个用于登录的会话并且您可能需要另一个会话来执行其他操作时,这种情况更有可能发生(无论如何都不建议这样做)。我的案例是 flash() 方法,仅在添加/更新/删除帖子后我才用它来创建会话。并在视图中使用该会话来显示消息,然后销毁它。每次我在添加/更新/删除用于登录的其他会话时创建新会话时都会被破坏。这不是经常发生的事情,但有可能。


0
投票
$_SESSION["feedback"]="Bla bla sth";
header('location:'.srv.'feedback');

Chrome 中标头位置重定向后会话被销毁。 但在 Firefox 中一切都运行良好。 在 Chrome 中,在隐身模式(私人窗口)下,一切都运行良好。

我认为这是基于浏览器的缓存问题。 作为一名开发人员,您尝试了很多次,chrome 缓存了一些东西。


-2
投票

我也遇到了同样的问题,我发现使用Session相关的功能有助于确定是否启动了Session

if(session_status == PHP_SESSION_NONE)
   session_start();

-4
投票

不需要在每个页面都启动session_start()。因为直到您的浏览器关闭之前,您在 php.ini 中指定的整个路径仍然保留相同的会话

© www.soinside.com 2019 - 2024. All rights reserved.