読者です 読者をやめる 読者になる 読者になる

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]