SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【Apache】Rewriteのクエリ文字列のエンコード、デコード

問題

Rewriteでパラメータをつけると、%エンコードされていたものがデコードされたりする?

答え

エンコードさせたり、させなかったりできる。

.htaccess で以下のようになっているとき

RewriteEngine On
RewriteRule ^index.php\x3F(.*)$ ./?$1 [L]

以下のようなURLにアクセスすると、

/index.php%3Fcode%3DXXXXXXXXXXXXX%252B3XkFG%252BGcNb%252B%252BlgqN7I9Pv2LjMTQm8%253D

$_GET はこうなりました。

  ["code"]=>
  string(44) "XXXXXXXXXXXXX+3XkFG+GcNb++lgqN7I9Pv2LjMTQm8="

アドレスバーに入力

/index.php%3Fcode%3DXXXXXXXXXXXXX%252B3XkFG%252BGcNb%252B%252BlgqN7I9Pv2LjMTQm8%253D

↓ Apacheに伝わって1回目デコード(この?はクエリ文字列の始まりではなく?という文字)

/index.php?code=XXXXXXXXXXXXX%2B3XkFG%2BGcNb%2B%2BlgqN7I9Pv2LjMTQm8%3D

↓Rewriteで2回目デコード

./?code=XXXXXXXXXXXXX+3XkFG+GcNb++lgqN7I9Pv2LjMTQm8=


phpの $_GET[“code”] は “XXXXXXXXXXXXX+3XkFG+GcNb++lgqN7I9Pv2LjMTQm8=” になる。

なお、ここで、%エンコード(エスケープ)したいとき、したくないときに対応できるようになっていて、Rewriteのフラグで制御できる。

エスケープしたくないとき

RewriteRule ^index.php\x3F(.*)$ ./?$1 [L]

エスケープしたくないとき

RewriteRule ^index.php\x3F(.*)$ ./?$1 [L,NE]

エスケープしたいとき

RewriteRule ^index.php\x3F(.*)$ ./?$1 [L,B]

関連するメモ

コメント(1)

HTMLの文字コードをUTF-8にしたら、フォームの要素(input)が大きくなった!(通常の約2倍) at softel メモ 2009年11月26日 08:43

[…] IEのデフォルトのフォントまわりは何かおかしい。 このあいだの話もそう。 […]