问题:
我正在尝试将 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 可以更快地实现目标。
... 但我认为您可能正在尝试解决一个可能存在缺陷的设计问题。如果您能进一步阐明您尝试使用此解决方案解决的问题,我们也许可以提出一些更清晰的建议。