PHP5.2以下から5.3以上へのバージョンアップ時にcookie以外の手段でセッションIDを保持する場合のメモ
とある携帯(ガラケー)サイトのPHPを5.2から5.4にアップデートしようとしてハマった。
携帯サイトではcookieを使えない場合もあるので、(セキュリティ的に良いか悪いかは別にして)URLにセッションIDを付ける場合はわりと多いのではないだろうか?
で、試しに5.4で動かしてみたらセッションがうまく引き継がれず、ログイン状態を維持できない場面に遭遇した。PHPのバージョンアップでセッション周りの動きが変わったのかと思い、殆ど触ったことのないプログラムをデバッグしまくって、原因箇所を特定しようと躍起になってみたものの全くわからない。コードを追うのを諦めてphpマニュアルを見ているとそれらしきものを発見。(というかビンゴ)
http://www.php.net/manual/ja/session.configuration.php#ini.session.use-only-cookies
どうやらPHP5.3からsession.user_only_cookies
のデフォルト値がオンになったみたい。すなわちcookie以外でのセッションIDの保持がデフォルトではできなくなってしまったようだ。このせいでURLにくっつけたセッションIDは使われなくなり、アプリケーション側はログオフ状態になってしまっていたようだ。
対策としては
php.ini
で
session.use_only_cookies = 0
とするか
.htaccess
で
php_value session.use_only_cookies Off
とするか phpで
<?php ini_set('session.use_only_cookies', 0);
とすれば良い。
PHPのバージョンアップは、言語の動きというよりも、設定のデフォルト値が変わってしまうことでハマることが多い気がする。