CakePHP の Session.checkAgent

CakePHP 1.3 のサイトを IE8 で閲覧するとセッションが切れてしまう問題に遭遇した。

CakePHP には、デフォルトでは、同一セッションで User-Agent が異なるリクエストがあった場合は、セキュリティ的によろしくないということで、セッションを削除してしまうことがわかった。その設定は、 config/core.php 内の Session.checkAgent 。

IE8 は、互換モードなる機能をもっており、旧バージョンをエミュレートすることができる。ただ、厄介なことにサイトを利用している途中で、モードが切り替わると User-Agent も切り替わってしまうようだ。

BTS にチケットがあった:

http://cakephp.lighthouseapp.com/projects/42648/tickets/394-losing-session-with-ie8-in-compatibility-mode

対策として以下の2点を考えてみた。

  • Session.checkAgent を無効化 (config/core.php)
<?php
	Configure::write('Session.checkAgent', false);
  • meta タグによるモードの指定 (layout のヘッダ部)
<meta http-equiv="X-UA-Compatible" content="IE=edge" />

Session.checkAgent を false にするのが一番手軽かも。一応、User-Agent が切り替わらないように meta タグもレイアウトのヘッダ部に追加しておいた。