2009-08-23 17 views
0

ファイルが要求されるとアンパサンドを私のシステムにさらに渡すことができます。問題は、Apacheがそれを多面的に処理することです。私は方法がわからないmod_rewriteは、アンパサンドのすべてのインスタンスを%26で後で置き換えます。

私はそれが何であるかを見ることができるように、すでに要求されたファイルをindex.phpに書き直していますが、そこにアンパサンドがあればそれを続けることはできません!

どのようにアンパサンドをエスケープしたり、16進数(%26)にすることができますか?

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule>` 

答えて

1

あなたの書き換え規則に

RewriteRule ^(.*)\&(.*)$ $1\%26$2 

を追加します。

+0

hmmこれは上の-f条件を破るように見えますが、今やすべての外部ファイルはサーバー上で動作していません – Supernovah

+0

RewriteRule行はどこに配置しましたか? –

0

あなたの上にこのルールを入れてみてください。また

RewriteRule ^([^&]*)&(.*) $1\%26$2 [N] 
0

あなたがURLにアンパサンドでブラウザにリダイレクトを送信したい場合は、の最後に[NE]フラグを追加することができますRewriteRule。

RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L] 
4

第一確認してURLのあなたはそれがあなたのサーバーに到達したときにそれがアンパサンドではありません%から26 &シンボルを逃れた構築しています。それは&に戻って、それを変換しませんので、あなたの書き換えルールにBタグを追加します?

のRewriteRule ^(。*)$ index.phpをURL = $ 1 [B、QSA、L]

このBタグは2日後に別の書き換えルールを試した後、私のお尻を保存しました。

0

それがPHPで処理されていた場合mod_rewriteによって変更されたクエリ文字列にアンパサンドをエスケープする適切な方法は、

%2526 

です。

Apacheが書き換えると、%2526から%26に変わり、phpは&に変換され、クエリ変数に格納されます。

書き換えルールも同じですが、パラメータのプラス記号はすべてPHPのプラス記号のままです。

私が直面しなければならなかった現実世界の例:それは

group.php?group=Simon+%26+Garfunkel 

に書き換え、あなたが

を望んでいた時に、PHPであなたが

$group="Simon+&+Garfunkel"; 

を取得

/group/Simon+%26+Garfunkel 

Bで あなたが正常に動作します

/group/Simon%20%26%20Garfunkel 

を必要とするBで

。あなたは

group.php?group=Simon%20&%20Garfunkel 

を取得し、&は、クエリ文字列を分割するので、あなたが

$group="Simon "; 

で終わるBなし

しかし、あなたは二重のエスケープ

/group/Simon+%2526+Garfunkel 

それは

group.php?group=Simon%20%26%20Garfunkel 

に書き換え、あなたが期待されるように

$group="Simon & Garfunkel"; 

で終わる場合。

URLがmod_rewriteによって「クリーンURL」に解析されない場合は、%26を正常に使用できます。

関連する問題