Como configurar o Apache como proxy reverso com o servidor remoto especificado em um parâmetro de string de consulta

Como configurar o Apache como proxy reverso com o servidor remoto especificado em um parâmetro de string de consulta

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 exprparte 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.

informação relacionada