ようこそゲストさん

CPA-LABテクニカル

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使う使わずに関わらず 
同じであれば見通しがいいかなーとか思ってたので。 




名前:  非公開コメント   

  • TB-URL  http://cpa-lab.com/tech/03/tb/