问题:
我试图configurationapache作为一个反向代理,其中在查询string参数中指定删除服务器。
假设我正在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.重写来自远程服务器的redirect响应。 例如,如果用户请求mywebapp.com/proxy?url= https://login.notmysite.com ,并且远程服务器以https://login.notmysite.com/redirect,则用户的浏览器应该会看到redirect到mywebapp.com/proxy?url= https://login.notmysite.com/ 。
3.支持http和https
4.支持cookies
5.合理的安全。 我不想为世界上的任何人打开一个代理服务器,只能在mywebapp.com网站上的iframe中使用。
环境:
我使用Apache 2.2.24,但我可以升级,如果这将使问题更容易解决。
当前configuration:
<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,这个configuration似乎工作正常,但是考虑到#2我碰到了一个障碍。 我知道你通常使用ProxyPassReverse命令处理redirect,但我不确定如何让它重写查询string参数。
问题:
鉴于考虑,Apache是解决这个问题的适当工具?
如果是这样,我如何设置Apache的configuration,以满足上述所有的考虑?
我知道这是一个很大的问题,如果你能提供一个能帮助我满足其中一个考虑因素的答案,那么我将更新上面的configuration让社区看到。
mod_headers可能能够处理这个。
Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"
expr部分需要apache 2.4。
注意:我没有testing过这个。
参考文献:
http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html
也许用庞德解决这个问题会更容易,更安全。 但是,这不是一个redirect,而是一个反向代理。
另外一个小的PHP脚本也可以做这个工作…
你的想法最大的问题是,如果你期望反向代理发送cookie到后端,但客户端不会发送cookie到前端(除非后端cookie域不如前端)。
我build议mod_proxy可能太难使用了,在这种情况下,你可以用mod_rewrite更快地达到你的目标。
…但我认为你可能试图解决一个可能的错误devise的问题。 也许如果你能用这个解决scheme进一步阐明你正在试图解决的问题,我们可能会提出一些更清洁的build议。