号泣。CakePHPでSessionが突如切れるのはfaviconのパスが問題でした
号泣。CakePHPでSessionが突如切れるのはfaviconのパスが問題でした
まさかメールフォームのSessionデータの受け渡しで躓いて丸一日潰すハメになろうとは・・・
でもこれで原因がちゃんと分かりましたし、今後Sessionが突如切れた場合、他のケースでもどのように対応したらよいのかが分かっただけでもよしとします。
CakePHPで突如Sessionが切れる原因
どうやら、CSSや画像関連で実際に存在しないパス&URLを指定していると、サーバにHTTPアクセスを行い、そしてSessionが切れるという問題が発生するようです。
app/webroot/.htaccess
そこで、webroot下の.htaccessにこのように記述すればよいらしいのですが、
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(cgi|css|gif|jp?g|png)$
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
・・・ダメでした。
Controllerを疑う、いっそsession_start()を記述してみるなど色々ためすけどいずれもダメ。
viewを疑うなら、layoutsをはずす
一度冷静になろうと思い、layoutsをはずして、CakePHPのデフォルトレイアウトにしてみて、再度メールフォームをテストしたところ、
無事Sessionが引き継がれていることが確認でき、
やはりlayouts関連が怪しいのだとここで確定しました。
そこで対象のlayoutsファイルをよく確認してみるとfavicon.icoはwebrootの直下にあるのに、このようになっていました。
<link rel="shortcut icon" href="favicon.ico" />
ややや・・・お前かい!!
先頭にスラッシュをつけてあげると、無事Sessionの引継ぎを確認出来ました!
<link rel="shortcut icon" href="/favicon.ico" />
Sessionの引継ぎがうまくいかないほかの事例
今回海外のサイトも、日本のサイトも調べまくって、最後はfaviconかいっ!!っていうお粗末な結果になりましたが、
Sessionが突如切れてしまうケースが他にも色々な事例が報告されており、
大きく別けて3つがあげられるようです。
- ブラウザ依存
- core.phpのSecurity.level
- view側で何らかのCSSや画像関連の取得ミス
Sessionの引継ぎがうまくいかなかったら
2.core.phpのSecurity.levelをlowにする
3.view側を疑って、デフォルトレイアウトに変更する
この3つの順番で試してみるといいと思います。
まさかfaviconたった一個でここまで悩むことになろうとは思いもしませんでしたが、Session引継ぎトラブル回避のよい勉強になりました
追記:Sessionの名前変更したら無事動いたよ!
追記2012/11/07
再びCakePHPのSession問題で悩んでいました。今回は上記3つにはいずれも当てはまりません。
自分がCakeで以前作ったプログラムを基本全てコピーして、新しいサイトを作っていたのですが、コピー元は動くのに、複製版は動きません。
Sessionの書き込みは確認できるのに、読み込まれずにいつも新規でSessionを生成してしまうので、全くSessionの意味を果たしていません。
で、腹が立ったのでSessionの名前を変更してみたら何と動きました!
//元 $this->controller->Session->read('seed'); //こちらにSession名を変更 $this->controller->Session->read('seed_id');
なんと、これで動くようになったんです。
原因は不明ですが、どうしてもSessionが動かないとき、いっそSessionの名称を変えるのも一つの選択かも!