web-dev-qa-db-ja.com

Codeigniterでリダイレクト後にセッションが失われる

私はcodeigniterをフレームワークとして使用しています。

まず、localhostを使用しますが、IPアドレスに変更すると、ログイン機能が機能しなくなります。別のコントローラーにリダイレクトすると、セッションが失われることがわかりました。

print_r($this->session->all_userdata());の結果は次のとおりです

[session_id] => 7b00fa0f8790f48d24446f9eb4e6aab2 
[ip_address] => 10.42.68.71 
[user_agent] => Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1
[last_activity] => 1285962398 
[user_data] =>

ご覧のとおり、user_dataに渡されるデータはありませんが、テスト時にリダイレクトの前に設定されました。

コントローラーを2つに分け、最初の1つはユーザー->ログイン関数のハンドラー、もう1つはプランナーで、ユーザーコントローラーからリダイレクトするリンクのハンドラーです。

users.php(最初のコントローラー):

$this->load->model('users_model');
$this->load->model('mymodel');
$this->load->database();

$email = $this->input->post('email');

$pass = $this->input->post('password');

$type = $this->input->post('type');

// Authenticate the user
$userdata = $this->users_model->auth_user($email,$pass,$type);

if($userdata)
{
    $data = array('FIRSTNAME' => $userdata->FIRSTNAME, 
                  'LASTNAME' => $userdata->LASTNAME, 
                  'EMAIL' => $userdata->EMAIL,
                  'LOGIN' =>TRUE, 'TYPE' => $type);
    $this->session->set_userdata($data);
    redirect('planner/view_system','refresh');
}

planner.php(2番目のコントローラー):

function __construct() {
    parent::__construct();

    if ( ! ($this->session->userdata('LOGIN')))
    { 
        print_r (var_dump($this->session->userdata('FIRSTNAME')));
        print_r($this->session->all_userdata());
    }
    $this->load->helper(array('form','html','url'));

そして、これが私の設定です

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = TRUE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;
19
Zatanna

まず、セッションアイテムに「\ n」や「\ v」などの特殊文字が含まれていないことを確認する必要があります。これらの文字により、文字列が途中で切れる場合があります。 trim() を試してください。

それが役に立たない場合は、おそらくエンコーディングの問題です。セッション項目を設定する前に暗号化し、使用する必要があるときに復号化してください。

2
user1685398

$ config ['cookie_domain']をlocalhostに設定することでこの問題を解決しました

$config['cookie_domain']    = "localhost";

私は最初、その変数をwww.exampledomain.comなどの完全修飾ドメイン名に設定していましたが、その間ローカルサーバーを使用していました。

Codeigniterセッションクラスでの予期しないエラーを回避するために、スクリプトが実行されているドメインは、$ config ['cookie_domain]で設定されたドメインと同じである必要があります。

1
katwekibs

私は同様の問題を抱えており、問題は非常にありふれたものになっています...

私の問題の悪の根源は、文字「_」を含む名前でした

例、以前は

$this->session->set_flashdata('message_success', 'some message');

になった後

$this->session->set_flashdata('messagesuccess', 'some message');

私の問題は解決しましたこのリソースのおかげで男 http://biostall.com/losing-codeigniter-sessions/

1
Dmitriy

autoload.phpファイルに1つ追加する必要があります。

$autoload['libraries'] = array('database','session');

これはセッションのリダイレクトの問題を解決します

1
shuvro

リンクを確認し、正しく記述されていることを確認してください。絶対URLを記述するときは、必ず「www」部分を追加してください。これが私の場合の問題でした。これが誰かの助けになることを願っています。


良い:header( "Location: http://www.yourdomain.com/controller/page ");


悪い(セッションを中断します):header( "Location: http://yourdomain.com/controller/page ");

0
Amin Balogun

私の経験から、問題は次のとおりです。

  1. ファイルの1つ(またはそれ以上)が「UTF-8 with BOM」ではありません(Webサイトが英語のみでなく、私のようなエンコードとしてUTF-8を使用する場合)。すべてのファイルを「UTF-8 with BOM」に変更する必要があります。 Notepad ++が役立ちます。
  2. phpタグの前または?>の後にいくつかの文字があります(?>を取り出してください)。スペースを含む文字がないことを確認してください。
  3. アドレスとしてlocalhost/xxxxxxを呼び出す場合、127.0.0.1/xxxxxxまたはLAN IPに変更します
  4. セッションは常にファイルではなくDBに保存します(デバッグが簡単です)。
0
mohonid1

この問題に遭遇したとき、最初はショックを受けました。セッションデータに@記号が付いていたので、それは私に起こりました。

解決策は、base64_encodeを使用してデータを単純にエンコードすることです。

例えば:

$Data = urlencode(  base64_encode($Email) );
$this->session->set_userdata('Data', $Data);

それを再利用するには、次のようにします:

$Data = base64_decode( urldecode( $this->session->userdata('Data') ) );

お役に立てれば。

新しい検索:この問題は、someブラウザーおよびデバイスで引き続き発生します。したがって、これは実際にはもう解決策ではありません。たとえば、Samsung Android、MicroMAX Androidで動作しますが、Huawei Androidでは動作しません。

0
itsols

私はまったく同じ問題を抱えており、これが私がしていることです。まず、ファイル_system/libraries/Session/Session.php_に移動します。 _140_行のsession_start();をコメントします。 _function _configure_で、_// Security is king_の下に数行コメントします

_//      ini_set('session.use_trans_sid', 0);
//      ini_set('session.use_strict_mode', 1);
//      ini_set('session.use_cookies', 1);
//      ini_set('session.use_only_cookies', 1);
//      ini_set('session.hash_function', 1);
//      ini_set('session.hash_bits_per_character', 4);
_

次に、ルートプロジェクトの_index.php_ファイルに移動します。置く、session_start();以下_<?php_

お役に立てれば。

0
mbdrian

遅すぎますが、幸いにも同じ問題に直面していました。以下のように設定を少し変更することでこの問題を解決します。

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = TRUE; // change this
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = TRUE; // change this
$config['sess_match_useragent'] = TRUE; // change this
$config['sess_time_to_update']  = 300;

これがあなたにも役立つことを願っています。

0
Syed Arif Iqbal

私の場合、いくつかのテスト(localhostでhttpsおよびhttpを使用)の後、その問題に対してエラーが発生し、$ config ['cookie_secure']が適切に設定されていないため、config.phpで変更を試すことができます。

$config['cookie_secure']    = FALSE; // if is not under https, or true if you use https

乾杯!

0
elverde

私と同じ問題。

コントローラにセッションライブラリをロードしているか確認してください。

$this->load->library('session');
0
bkac