ケータイで「mod_rewrite + セッション」を使う際の注意点

2008/6/6 金曜日 Posted in DoCoMo, サーバ | 4 Comments »

ここ最近は大きなニュースが多く、ニュース記事の紹介ばかりでしたので、ひさしぶりに技術メモ的なものを書きたいと思います。   先日mod_rewriteを使っていて、セッション絡みで少しつまづいた件をご紹介します。 実はPHPで動いているページを、「*.html」として静的コンテンツに見せる、というものを作ろうとしていました。 .htaccessの内容としては次の通りです。 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^([0-9A-Za-z~_\-\.]+)\.html$ /viewer.php?p=$1 [L] </IfModule>   ブラウザで正常に動作することを確認し、その後ドコモの実機でテストしたのですが、何度試してもセッションを引き継いでくれません。 それもそのはず、ドコモ端末はcookieが使えませんので、URLにセッションIDを埋めこんで引き継いでいく必要があります。 上記のような設定では、mod_rewriteがセッションIDの引数をカットしてしまうのです。   というわけで、ケータイのセッションに対応するための設定は以下のようになります。 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^([0-9A-Za-z~_\-\.]+)\.html$ /viewer.php?p=$1 [QSA,L] </IfModule> [QSA,L]の部分の、QSAフラグがポイントとなります。 リファレンスによると、QSAフラグは次のように説明されています。 このフラグは、置換文字列の中でマッチしたものを書き換えるのではなく、 そこにクエリー文字列部分を追加するように、書き換えエンジンに強制します。書き換えルールを通してクエリー文字列に何かデータを追加したい場合にこのフラグを使います。 ちょっとわかりづらい説明ですが、要はアクセスされたURLについていたクエリー文字列を、そのまま引き継ぐためのフラグです。 これをつけることによって、セッションIDを失うことなくプログラムに渡すことができます。 次のような書き方でも、同じように動くようです。 viewer.php?p=$1&%{QUERY_STRING} [L]   なお、ケータイのセッションに関する詳しい説明は、こちらをご覧ください。 → PHPでケータイからセッションを使う場合の設定方法   関連: ケータイキャリア毎に振り分けを行うには(mod_rewrite編) PHPでケータイからセッションを使う場合の設定方法 Read more..