ケータイで「mod_rewrite + セッション」を使う際の注意点
    このエントリをはてなブックマークに登録

ここ最近は大きなニュースが多く、ニュース記事の紹介ばかりでしたので、ひさしぶりに技術メモ的なものを書きたいと思います。

 

先日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でケータイからセッションを使う場合の設定方法

 

関連:


 

最近の記事







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

  1. […] original article « [Perl][Moose] Moose::Cookbook::Recipe1 時事ドットコム:漫画原稿紛失で小学館提訴=作者が330万円請求―東京地裁 » […]

  2. 突然のコメントを失礼いたしますm(__)m
    携帯サイトを構築する際に、mod_rewriteを使用してURLリダイレクトしてましたが、セッションが消える問題についてこちらの記事を参考に解消が出来ました。とても参考になり大変感謝しています。

  3. お役に立てたようで何よりです ^^
    コメントありがとうございました。

コメントを書く