1

古い Apache (2.2.17) をプロキシにしようとしています:

http://foo.com/proxy/?url=http%3A%2F%2Fbar.com%2foo

に:

http://bar.com/foo

私は持っている:

RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^/proxy/ %1? [P,L]

残念ながら、これにより Apache は URL エンコードされた値 (ログ出力) をプロキシしようとします。

(3) パターン '^/proxy/' を uri '/proxy/' に適用
(4) RewriteCond: input='url='http%3A%2F%2Fbar.com%2foo'' pattern='^url=(. *)$' => 一致
(2) '/proxy/' を書き換え -> ''http%3A%2F%2Fbar.com%2foo'?'
(3) 分割 uri='http%3A%2F%2Fbar.com%2foo'? -> uri='http%3A%2F%2Fbar.com%2foo', args=
(2) http://foo.com/ 'http%3A%2F%2Fbar.com%2foo'
( 1) プロキシ リクエスト プロキシを使用します:http://foo.com/'http%3A%2F%2Fbar.com%2foo' [OK]

したがって、2 つの問題があるようです。1 つは結果にアポストロフィが含まれていること、もう 1 つは結果が URL デコードされていないことです。Apache が元の protocol://host を先頭に追加する理由は、結果が URL として認識されないためだと思います。

4

1 に答える 1

3

仮想ホスト/サーバー構成にアクセスできる場合 (そしてアクセスできるように見える場合)、apache の組み込みの書き換えマップの 1 つを構成して、エスケープを解除できます。

RewriteMap unescape int:unescape

次に、ルールでマップを使用できます。

RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^/proxy/ ${unescape:%1}? [P,L]
于 2012-09-14T00:06:53.417 に答える