
Problema:
Estou tentando configurar o Apache como um proxy reverso onde o servidor de remoção é especificado em um parâmetro de string de consulta.
Digamos que eu esteja servindo um site em mywebapp.com. Se você navegou parahttp://mywebapp.com/proxy?url=http://www.someothersite.com, então o apache deve atuar como um proxy reverso parahttp://www.someothersite.com. Da mesma forma, se você navegou parahttp://mywebapp.com/proxy?url=https://login.notmysite.com, então o apache deve atuar como um proxy reverso parahttps://login.notmysite.com.
Considerações:
1. Reescreva os URLs relativos no html de resposta para passar pelo proxy
2. Reescreva as respostas de redirecionamento do servidor remoto. Por exemplo, se o usuário solicitar mywebapp.com/proxy?url=https://login.notmysite.come o servidor remoto responde com um redirecionamento parahttps://login.notmysite.com/, o navegador do usuário deverá ver um redirecionamento para mywebapp.com/proxy?url=https://login.notmysite.com/.
3. Suporte http e https
4. Suporte a cookies
5. Segurança razoável. Não quero abrir um proxy para qualquer pessoa no mundo usar - ele só deve ser usado em um iframe no site hospedado em mywebapp.com.
Ambiente:
Estou usando o Apache 2.2.24, mas posso atualizar se isso tornar o problema mais fácil de resolver.
Configuração atual:
<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>
Esta configuração parece estar funcionando corretamente para a consideração nº 1, mas encontrei um obstáculo com a consideração nº 2. Eu sei que você geralmente lida com redirecionamentos com o comando ProxyPassReverse, mas não tenho certeza de como reescrever o parâmetro da string de consulta.
Questões:
Dadas as considerações, o Apache é uma ferramenta apropriada para resolver este problema?
Em caso afirmativo, como configuro a configuração do Apache para atender a todas as considerações acima?
Eu sei que esta é uma grande questão - se você puder contribuir com uma resposta que me ajude a atender apenas uma das considerações, atualizarei a configuração acima para a comunidade ver.
Responder1
mod_headers pode ser capaz de lidar com isso.
Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"
A expr
parte requer o Apache 2.4.
Nota: eu não testei isso.
Referências:
http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html
Responder2
Talvez resolvendo comLibraseria mais fácil e seguro. Mas então não é um redirecionamento, mas um proxy reverso.
Além disso, um pequeno script php também poderia fazer o trabalho ...
Responder3
O maior problema com a sua ideia é que se você espera que o proxy reverso envie cookies para o backend, mas o cliente não enviará cookies para o frontend (a menos que o domínio do cookie do backend seja inferior ao frontend).
Eu sugeriria que o mod_proxy provavelmente seria muito difícil de usar e, nesse caso, você alcançaria seu objetivo mais rapidamente com o mod_rewrite.
... mas acho que você provavelmente está tentando resolver um problema com um design provavelmente defeituoso. Talvez se você puder elucidar mais sobre o problema que está tentando resolver com esta solução, poderemos sugerir algo um pouco mais limpo.