It's raining cats and dogs.

無駄なことなんてないはず

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のバージョンアップは、言語の動きというよりも、設定のデフォルト値が変わってしまうことでハマることが多い気がする。