僕はセッションをDB(MySQL)で管理するよう設定ファイル(confing.php)で設定しているのですが、表題の通りWEB上でページ移動をするとセッションが消えてしまう状態に陥ってしまい、かれこれ数時間もこの作業に費やしてしまいました。
管理画面にて「● ●様」と言うテキストを使っており、会員の名前やその他情報をセッションに保存して表示したい思っていました。
…がどうやってもセッションから情報が読み取れない。
login.phpで画面遷移せずにセッションの中身を見てみると、情報を格納している。
ん?どういうことだ!?
画面遷移しなかったら情報は入っているのにログイン画面から管理画面のメインページにリダイレクトするとセッション情報がなくなっている。。
本当に調べまくりました。
原因が全く分からず、ただ時間だけが過ぎていき、モンスターも3本目。
あきらめていた時に下記URLにたどり着きました。
https://codeday.me/jp/qa/20190404/543645.html
結論から言うと、すごく単純なことで…自分でも恥ずかしい限りでした。
このURL先に「ベストアンサー」なるものを読んでいくと、
あなたがこれをテストしているときあなたはhttps://を通してあなたのページを呼んでいますか…?
ps://codeday.me/jp/qa/20190404/543645.html
それ以外の場合、説明は簡単です。
ini_set(‘session.cookie_secure’, 1);
これにより、PHPはセッションCookieにセキュアフラグを設定します。つまり、ブラウザは、セキュア接続を介して行われたリクエストでのみこのCookieを返送することが許可されます。
ですから、実際にHTTPだけでこれをテストしているのであれば、セッションクッキーは次のリクエストで返送されないので、PHPはセッションIDを見つけません。そのため、session_startを呼び出すと新しいセッションが始まります。
設定ファイルの書き方に問題があっただけでした。。
僕が使っているcodeIgniter3.1.0では、confing.phpの約430行辺りの
$config[‘cookie_secure’] = TRUE;
$config[‘cookie_httponly’] = FALSE;
とっていました。
つまりセキュリティ上、httpsにのみ対応する。
ってなっていたのです。
だからサーバー側では動いたのにローカル(XAMPP)ではセッションがなくなったのだと。
よって下記のように変更しました。
$config[‘cookie_secure’] = FALSE;
$config[‘cookie_httponly’] = TRUE;
問題なくページが変わってもセッションの情報を保持できるようになりました。
一体、これに何時間使ったんだろうか?
情けないです。でも、これで勉強になりました。
設定ファイルはまず、細部にわたるまで確認しましょう。
同じ悩みで迷っている方の救いの手助けになれば幸いです。