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) 继续代理请求 proxy:http://foo.com/'http%3A%2F%2Fbar.com%2foo' [OK]


所以,看来有两个问题。一种是结果中有撇号,另一种是结果没有经过 URL 解码。我认为 Apache 在原始协议之前添加的原因://主机是它没有将结果视为 URL。

4

1 回答 1

3

如果您有权访问 vhost/server 配置(并且看起来像您这样做),您可以配置 apache 的内置重写映射之一来为您取消转义:

RewriteMap unescape int:unescape

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

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