【问题标题】:How can I proxy a query string URL in Apache?如何在 Apache 中代理查询字符串 URL?
【发布时间】:2012-09-13 23:57:04
【问题描述】:

我正在尝试让较旧的 Apache (2.2.17) 进行代理:

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

到:

http://bar.com/foo

我有:

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

不幸的是,这导致 Apache 尝试代理 URL 编码值(日志输出):

(3) 将模式 '^/proxy/' 应用到 uri '/proxy/'
(4) RewriteCond: input='url='http%3A%2F%2Fbar.com%2foo'' 模式='^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) go-ahead with proxy request proxy:http://foo.com/'http%3A%2F%2Fbar.com%2foo' [OK]

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

【问题讨论】:

    标签: apache proxy urldecode


    【解决方案1】:

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

    RewriteMap unescape int:unescape
    

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

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

    【讨论】:

    • 这修复了 URL 解码问题。我现在得到:foo.com/'http://bar.com/foo'我如何去掉撇号并让它代理真实的 URL?
    • @JayVachhani 根本不应该在那里,这在我的 apache 安装中对我有用。除非查询字符串中的 url 周围有 ',否则我想您可以通过将正则表达式更改为:^url='?(.*?)'?$ 来选择性地摆脱它们
    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2014-01-30
    • 2020-11-29
    相关资源
    最近更新 更多