PHPで画像やcssの404エラーでセッション切れになる現象
はじめに
FuelPHPを使っていて、セッションが切れることがあり調査していました。
ググるとドキュメントルートにファビコンが存在していないと発生するなどの記事がヒットするのですが、ファビコンだけでなく読み込んでいる画像やcssがなくても同じ事象が発生することがわかったのでまとめておきます。
結局FuelPHPだけの話ではなかったです。
原因
FuelPHPに限らず、PHPのWebアプリケーションフレームワークだと、たいてい.htaccess
にこんな感じの設定があります。
リクエストされたパスがファイルやディレクトリじゃなかったら、フロントコントローラーであるindex.php
に処理を投げるというものです。
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php$1 [L]
通常、画像やcssは最初の条件に該当するのでindex.php
で処理しないのですが、ファイルが存在しない場合、どちらの条件にも該当せずindex.php
で処理することになります。
コントローラーには画像やcssファイル名のアクションはないので、最終的に404に流れます。
index.php
内(というか、その先のコントローラーなど)で、FuelPHPで言うフラッシュセッションのような次のリクエスト時に消えるセッションを使用していると、404リクエストで消えてしまうためセッション切れが発生します。
生存期間の長い通常のセッション使っても解決するのですが、フォームデータの削除し忘れとか嫌ですし。
対策
コントローラのアクション以外をindex.php
で処理しなければいいので、.htaccess
の設定をこんな感じにすれば良いです。
特定の拡張子(この例ではcss/jpeg/png)の場合、index.php
で処理しないようにしています。
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^.*\.(css|jp?g|png)$ RewriteRule ^(.*)$ /index.php$1 [L]