如何使用查询字符串参数指定远程服务器来将 apache 配置为反向代理

如何使用查询字符串参数指定远程服务器来将 apache 配置为反向代理

问题:
我正在尝试将 apache 配置为反向代理,其中在查询字符串参数中指定删除服务器。

假设我正在为 mywebapp.com 网站提供服务。如果您导航到http://mywebapp.com/proxy?url=http://www.someothersite.com,那么 apache 应该充当反向代理http://www.someothersite.com。同样,如果您导航到http://mywebapp.com/proxy?url=https://login.notmysite.com,那么 apache 应该充当反向代理https://login.notmysite.com

注意事项:
1. 重写响应 html 中的相对 URL 以通过代理
2. 重写来自远程服务器的重定向响应。例如,如果用户请求 mywebapp.com/proxy?url=https://login.notmysite.com远程服务器会重定向至https://login.notmysite.com/,则用户的浏览器应该会看到重定向到 mywebapp.com/proxy?url=https://login.notmysite.com/.
3. 支持 http 和 https
4. 支持 cookies
5. 合理的安全性。我不想为世界上的任何人打开代理 - 它应该只在托管在 mywebapp.com 的网站上的 iframe 中使用。

环境:
我正在使用 apache 2.2.24,但如果这样可以使问题更容易解决,我可以升级。

当前配置:

<VirtualHost 127.0.0.1:8081>
    ServerName www.mywebapp.com
    SSLProxyEngine On

    RewriteEngine on
    RewriteCond %{QUERY_STRING} ^url=(.*)$
    RewriteRule ^/proxy - [E=url:%1]

    RewriteCond %{QUERY_STRING} ^url=(https?://[^:/]+)/?
    RewriteRule ^/proxy - [E=url_host:%1]

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

    ProxyPassInterpolateEnv On
    ProxyPassReverse /proxy/ ${url_host} interpolate

    <Location /proxy>
        ProxyHTMLEnable On
        ProxyHTMLInterp On
        ProxyHTMLURLMap /   ${url_host}/ V
        RequestHeader   unset   Accept-Encoding
    </Location>
</VirtualHost>

对于考虑因素 #1,此配置似乎工作正常,但我在考虑因素 #2 时遇到了障碍。我知道您通常使用 ProxyPassReverse 命令处理重定向,但我不确定如何让它重写查询字符串参数。

问题:
考虑到这些因素,Apache 是否是解决此问题的合适工具?
如果是,我该如何设置 Apache 的配置以满足上述所有考虑因素?

我知道这是一个大问题 - 如果您能提供一个答案来帮助我满足其中一个考虑因素,那么我会更新上述配置以供社区查看。

答案1

mod_headers 也许能够处理这个问题。

Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"

expr部分需要 apache 2.4。

注意:我还没有测试过这一点。

参考:

http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html

答案2

也许可以解决这个问题会更简单、更安全。但这不是重定向,而是反向代理。

一个小的 php 脚本也可以完成这项工作......

答案3

你的想法最大的问题是,如果你希望反向代理将 cookie 发送到后端,但客户端不会将 cookie 发送到前端(除非后端 cookie 域低于前端)。

我认为 mod_proxy 可能太难使用,在这种情况下,使用 mod_rewrite 可以更快地实现目标。

... 但我认为您可能正在尝试解决一个可能存在缺陷的设计问题。如果您能进一步阐明您尝试使用此解决方案解决的问题,我们也许可以提出一些更清晰的建议。

相关内容