PHPでsessionが引き継げない場合に見落としがちな対処方法
Nginx + PHPの構成で動作しているサーバでセッションが引き継げない事象に遭遇しました。
よく言われる対処方法は以下のとおり。
- 「<?php」の直後に「sessin_start()」 を配置すること。
- ブラウザでクッキーをブロックしていないこと。
- 同じドメイン内でのリダイレクトであること。
今回はこれ以外の対応が必要でした。
結論から申し上げると、原因は「ディレクトリの権限」でした。
セッション情報をファイルに保存する構成をとっていたのですが、この場合、デフォルトで「/var/lib/php/session」に保存されます。ファイルに保存されるかどうかはphp.iniの「session.save_handler」の項目で確認できます。
以下のようになっていればファイル保存ですね。
1 2 3 |
# cat cat /etc/php.ini |grep -v ";" |grep session.save" session.save_handler = files # |
現在保存されているか確認します。
1 2 3 |
# ll /var/lib/php/session total 0 # |
はい、保存されていません。
では、ディレクトリの権限はどうなっているのか。確認してみます。
1 2 3 |
# ls -ld /var/lib/php/session drwxrwx--- 2 root apache 4096 Feb 18 2017 /var/lib/php/session # |
んん??なぜかグループがapacheになっています。
これをnginxに変更してみます。
1 2 3 4 |
# chgrp nginx /var/lib/php/session # ls -ld /var/lib/php/session drwxrwx--- 2 root nginx 4096 Sep 23 22:58 /var/lib/php/session # |
続いてブラウザでアクセスしてみます。
こちらがブラウザアクセス後の同ディレクトリ内の状況です。
1 2 3 4 5 |
# ls -l /var/lib/php/session total 8 -rw------- 1 nginx nginx 246 Sep 23 23:00 sess_7j28cp48k37lmepoeskedi26c1 -rw------- 1 nginx nginx 246 Sep 23 22:58 sess_nsdfguhk4mackubpdi5u32lfa0 # |
無事ファイルが作成されました。
これは見落としがちですね。カモトラも初めての事象でした。
基本と言えば基本なんですが、sessionが引き継げない場合の見落としがちな箇所ですね。
こういった対処が必要になる場合もあるので、sessionが引き継げなくてハマってしまった方は確認してみて下さい!
今回はnginxで使用していたためnginxグループに変更しましたが、apacheを使用していて、ここがnginxになっている場合はapacheグループに変更しましょう。
※nginxやapacheでの起動グループを変更している場合はこの限りではありません。自身の環境に合わせてください。
ちなみに、このディレクトリの権限を「777」にしてもアクセスできますが、セキュリティ上望ましくないので絶対にやめましょう!