我如何在Apache中代理查询stringURL?

我试图让一个较旧的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 =(。*)$'=> matching
(2)重写'/ proxy /' – >''http%3A%2F%2Fbar.com%2foo'?'
(3)split 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的原因在于原来的协议://主机是它看不到结果作为一个URL。

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

RewriteMap unescape int:unescape 

那么你可以在你的规则中使用地图:

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