3

我无法让 PHPsession_regenerate_id()在我正在开发的应用程序中工作。该应用程序使用(松散的)自制 MVC 框架并使用通过文件重定向所有请求。.htaccessindex.php

我正在尝试在注销时重新生成会话 ID,但它无法正常工作。

这是我的注销控制器中的一些代码 - expired 变量是对会话超时的检查:

    session_regenerate_id(true);        
    if(isset($_SESSION['expired']))
    {
        $this->registry->template->expired = true;
    }

    session_unset();
    session_destroy();

同样相关的是 index.php 文件开头的代码:

    session_cache_expire(20);
    session_start();
    session_name("TMU");
    //session_regenerate_id();

我在session_id()每个页面的底部回显结果,以查看它包含的内容以测试它是否已重新生成。

但是,当您注销时会话 ID 不会更改。当您再次登录时(即使使用另一个帐户),会话 ID 也是相同的。

您会注意到 index.php 文件的注释掉的第四行 - 如果我取消注释该行,ID 似乎会在每个页面上重新生成。但是,当我再次注释掉该行时,会话 ID 再次是我在索引文件中取消注释该行之前的原始 ID...

我只是想知道我怎样才能让 session_regenerate_id()工作。似乎它只是没有“提交”更改后的 ID。我试过使用session_commit(),但我不明白它是如何完全工作的,当我试图破坏会话时它给了我一个错误。

PHP 5.3.10 和 Apache 2.2.21

4

1 回答 1

5

多次重温这个话题后,我想通了。有两个问题。

  1. session_regenerate_id()必须在显示任何 HTML 输出和/或发送标头之前调用。(它需要作为第一个函数之一调用,就像session_start())。
  2. 订单很重要。session_name("TMU")需要在session_start()获得预期结果之前调用 - 我之前没有发现这一点。

基本上发生在我身上的事情是在导致它设置两个会话 ID cookie - 两个会话 - 一个名为 TMU 另一个只是默认的 PHPSESSIDsession_name("TMU")之后调用。session_start()更改顺序解决了我的所有问题并重新生成 ID/销毁旧会话现在可以按预期工作。

对于在执行此操作时遇到问题的任何人,我建议您回显 $_SESSION 和 $_COOKIE 数组,以查看您的特定应用程序中发生了什么。

于 2012-04-19T14:56:02.963 回答