【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]
HTMLの文字コードをUTF-8にしたら、フォームの要素(input)が大きくなった!(通常の約2倍) at softel メモ 2009年11月26日 08:43
[…] IEのデフォルトのフォントまわりは何かおかしい。 このあいだの話もそう。 […]