最近のauやソフトバンクならクッキーを使える(ゲートウェイでクッキーつけてるっぽい?)ので問題ないのですが、厄介なのはドコモです。
ドコモはクッキーも使えませんし、HTMLのほうも、CSSが全く利用できません。
つくづく、独自規格をいくキャリアですね。そんなだから世界の中で孤立してしまうんですよ。
とぼやいてもしかたないので、URLにセッションIDを持たすようにCakePHPを改造します。
参考にさせていただいたのはCakePHPで携帯サイトを作るです。
CakePHPのバージョンは1.2.0.7692 RC3です。
■まず、index.phpと同じディレクトリにある.htaccessに下記を追加します。
php_flag session.use_trans_sid On
php_flag session.use_cookies Off
これにより、クッキーの使用をOFFにして、リンクで移動するところ全てにGETセッションIDを引き継げるようになるらしいですが。。(つまり、リンクに勝手にセッションIDがつくということなんでしょう。)
しかし、なぜか自分の環境だとリンクに勝手にセッションIDがついてくれませんでした。
ということで、リンクや、フォームに全て手動でセッションIDをつけるようにしました。
■app/config/core/phpの設定変更
Security.levelをmidiumにします。
また、Security.levelをmidiumにするとセッションタイムアウトの時間がSession.timeout*100秒になってしまいます。デフォルトの120だと 120秒*100/60=200分ということで、3時間半にもなってしまうので値を小さくします。
なお、Security.levelとSession.timeoutの関係にはこちらを参照のこと。
//Configure::write('Security.level', 'high');
Configure::write('Security.level', 'medium');
//Configure::write('Session.timeout', '120');
Configure::write('Session.timeout', '20');//Security.level=mediumで33分
■cake/libs/controller/app_controller.php redirectメソッドをオーバーライド
リダイレクト時にセッションIDを負荷するよう redirect メソッドを下記のようにオーバーライドします。
class AppController extends Controller {
//redirect メソッド書き換え
function redirect($url,$status = null){
//携帯用にリダイレクトのURLの後ろにセッションIDを付けておく
if (strpos($url, "?") === false) {
$url = $url."?".session_name()."=".session_id();
}else{
$url = $url."&".session_name()."=".session_id();
}
parent::redirect($url,$status);
}
}
■cake/libs/router.php function url()の890行目付近を次のように書き換えます。
旧
if (!empty($named)) {foreach ($named as $name => $value) {
$output .= '/' . $name . $_this->named['separator'] . $value;
}
}
新 ↓
//携帯対応書き直し分if (!emptyempty($named)) {
$i = 0;
foreach ($named as $name => $value) {
//$output .= '/' . $name . $_this->named['separator'] . $value;
if ($i == 0) {
$output .= '?' . $name . "=" . $value;
}else{
$output .= '&' . $name . "=" . $value;
}
$i++;
}
}
■ビューでリンク時、フォーム送信時にセッションIDをつける
ビューにおいて、リンク時は下記のように最後にセッションIDをつけます。
echo $html->link('リンク', '/links/add?CAKEPHP=' . $_GET["CAKEPHP"] ); ?>
また、フォームのactionにもセッションIDを付与してあげます。