▼ 2008/01/09(水) RewriteRuleデコード対策
http://chaichan.web.infoseek.co.jp/qa6500/qa6764.htm
RewriteRuleのNEフラグの説明を読むと、URLエンコードをデコードするのが標準の動作みたいです。RewriteMapディレクティブを使えば書き換えもできますが、.htaccessでは無理ですね。 RewriteCondの後方参照を使うとか、環境変数を書き換えてみるとか、いろいろ試してみましたが、どれも上手くいきませんでした。 こういう仕様だと思って、PHPの方でフレキシブルに対応するのがよいのではないでしょうか?もしくはURLエンコードが必要なリクエストは書き換えないとか……。http://pc11.2ch.net/test/read.cgi/php/1023791370/151-232
174 :nobodyさん:2006/04/06(木) 05:28:11 ID:???
パラメーターに&が入ったときのmod_rewriteについて質問です・・
問題をvar_dumpを使って入ってきたパラメーターだけを表示するプログラムtest.phpにまとめてみました。
あと私のところで使ってる文字コードはUTF-8
<?
var_dump($_SERVER["QUERY_STRING"]);
echo "<br>\n";
var_dump($_GET);
$param = urlencode("coffee&tea");
$directUrl = "http://hoge.go.jp/test.php?keyword=". $param;
$rewriteUrl = "http://hoge.go.jp/". $param. "/";
echo "<br>\n";
echo "case 1 <a href=\"". $directUrl ."\">direct_url</a><br>\n";
echo "case 2 <a href=\"". $rewriteUrl ."\">rewrite_url</a><br>\n";
?>
で、.htaccessはこんな感じ
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^/(.*)/$
RewriteRule ^(.*)/$ /test.php?keyword=$1 [L]
175 :nobodyさん:2006/04/06(木) 05:28:46 ID:???
case1のdirect_urlの場合http://hogehoge.go.jp/test.php?keyword=coffee%26teaを生成。
そのURL(自分自身なわけだけど)に飛ぶと以下の文字列を吐き出す
string(20) "keyword=coffee%26tea"
array(1) { ["keyword"]=> string(10) "coffee&tea" }
これはOK。これにrewriteを噛ましたい。
問題のcase 2、rewrite_urlの場合http://hoge.go.jp/coffee%26tea/を生成。
飛ぶとmod_rewrite補足され、変換される。以下ログから抜粋
(3) [per-dir /var/www/hoge.go.jp/] applying pattern '^(.*)/$' to uri 'coffee&tea/'
(4) RewriteCond: input='/coffee&tea/' pattern='^/(.*)/$' => matched
(2) [per-dir /var/www/hoge.go.jp/] rewrite coffee&tea/ -> /test.php?keyword=coffee&tea
(3) split uri=/test.php?keyword=coffee&tea -> uri=/test.php, args=keyword=coffee&tea
そのURLに飛ぶと以下の文字列を吐き出す
string(18) "keyword=coffee&tea"
array(2) { ["keyword"]=> string(6) "coffee" ["tea"]=> string(0) "" }
%26がmod_rewriteで&にデコードされちゃってteaが引数名になっちゃうよ・・・
対策法ご存知の方教えてください・・・あるいはどこか設定が悪いのか・・・
176 :nobodyさん:2006/04/06(木) 08:11:14 ID:???
>>175
$rewriteUrl = "http://hoge.go.jp/". urlencode($param). "/";
177 :nobodyさん:2006/04/06(木) 08:59:39 ID:???
>>176
あー、なるほど、mod_rewriteにはurlencodeを2重に仕込むのね。
mod_rewriteを延々と弄っててきがつかんかった。
確認取ったところ上手く動きました。
この方法でやってみます。サンクス。
しかしmod_rewrite側での対応は設定はやはり難しいのかなぁ・・・
PHPに入ってくるエンコード状態と出て行くエンコード状態がrewrite使う使わずに関わらず
同じであれば見通しがいいかなーとか思ってたので。
▼ コメント(0件)
- TB-URL http://www.cpa-lab.com/tech/03/tb/