PHPで、ずいぶんと悩んだ、という話。
httpsでアクセスしたページでセッション情報を設定して、その後、httpでアクセスするページへ移動したら、セッション情報が消えてしまいました。
試してみたところ、httpからhttpsへの遷移でも、セッション情報が消えてしまう。
これまで使っていたサーバではそんなことはなくて、ある特定のサーバ1つでだけ、このセッション情報が消えてしまう現象が発生。
なんでだろう?と1日悩んで、やっと原因を発見しました。
suhosinでした。
ネット検索して見つけた、これらの情報が参考になりました。
http://www.yireo.com/blog/798-switch-between-http-and-https-looses-php-session
http://stackoverflow.com/questions/441496/session-lost-when-switching-from-http-to-https-in-php
http://www.hardened-php.net/suhosin/configuration.html
php.iniに
suhosin.session.encrypt=Off
を書き足したところ、無事に、セッション情報が保持されるようになりました。
suhosinが有効になっている場合、セッション関係の情報が暗号化されているらしく、そのcrypt keyに、DocumentRootを使うらしい。ただ、今回のサーバでは、httpとhttpsとでDocumentRootが違っていて、そのせいで、セッション情報がうまく保持されなかったのではないか?ということ。
上記の設定だと、せっかくのセキュリティ対策機能がゆるゆるになりそうなので、今回の場合では
suhosin.session.cryptdocroot=Off
とすることで十分でした。
☆
ちなみに、ほかのサーバではsuhosinを使っていなかったので(インストールはされていたけど有効になっていなかったり)、問題が起きなかった、というだけでした。
写真は本文と関係ありません。