2012-04-04 12 views
2

開発中のアプリケーションでPHPのsession_regenerate_id()が動作するのに問題があります。アプリケーションは(緩い)自作のMVCフレームワークを使用し、index.phpファイルを通して.htaccessを使用してすべての要求をリダイレクトします。PHPログイン/アウト時にセッションIDを再生成しない

ログアウト時にセッションIDを再生成しようとしていますが、正しく機能していません。ここで

は私のログアウトコントローラからいくつかのコードです - 期限切れの変数は、セッションタイムアウトのためのチェックです。また

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ファイルの4行目がコメントアウトされています。その行のコメントを外すと、すべてのページにIDが再生成されているように見えます。しかし、私が再びラインをコメントアウトすると、セッションIDはインデックスファイル内の行のコメントを外す前の元のIDになります。

私はどのようにしてession_regenerate_id()を得ることができますか?変更されたIDを「コミット」していないようです。私はsession_commit()を使ってみましたが、どのように完全に動作するのか分かりませんし、セッションを破棄しようとするとエラーになってしまいました。

PHP 5.3.10とApache 2.2.21

答えて

4

このトピックを数回再訪した後、私はそれを考え出しました。 2つの問題がありました。

  1. session_regenerate_id()は、HTML出力が表示され、ヘッダーが送信される前に呼び出す必要があります。 (session_start()のように、最初の関数の1つとして呼び出される必要があります)。
  2. ご注文内容session_name("TMU")は希望の結果を得るためにBEFORE session_start()と呼ばれる必要があります。二つのセッション - - その他のちょうどデフォルトのPHPSESSID TMUという名前の1

は基本的に私に起こっていたことsession_start()は、それが2枚のセッションIDクッキーを設定させた後session_name("TMU")を呼んでいました。順序を変更することですべての問題が修正され、IDの再生成/古いセッションの破棄が期待どおりに機能します。

これを行うことに問題がある人は、$ _SESSION配列と$ _COOKIE配列をエコーし​​て、特定のアプリケーションで何が起こっているのかを確認することをお勧めします。

関連する問題