如何在Apache中代理查询字符串URL?

时间:2012-09-13 23:57:04

标签: apache proxy urldecode

我正在尝试使用较旧的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'[确定]

所以,看来有两个问题。一个是结果中有撇号,另一个是结果不是URL解码的。我假设Apache正在使用原始协议的原因:// host是因为它没有将结果看作URL。

1 个答案:

答案 0 :(得分:3)

如果你有权访问vhost / server config(看起来像你这样),你可以为你配置一个apache内置的重写映射到unescape:

RewriteMap unescape int:unescape

然后您可以在规则中使用地图:

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