Como configurar o mod_proxy_html do apache para funcionar como um proxy ajax?

6

Estou tentando criar um site que permite visualizar e manipular dados de qualquer página em qualquer outro site. Para fazer isso, eu tenho que ignorar ' Allow Origin ' problemas: eu estou carregando o conteúdo do outro domínio em um iframe e eu tenho que manipular seu conteúdo com javascript baixado do meu domínio.

Minha primeira tentativa foi escrever um proxy simples, solicitando a página de outros domínios através de um proxy de servidor codificado em Java que não apenas serve o conteúdo, mas reconstrói os links (src's e href's) no conteúdo para que o conteúdo referenciado por eles links alse são baixados através do meu proxy feito à mão. O resultado não é ruim, mas tem problemas com o url em css e scripts.

Foi então que percebi que mod_proxy_html deveria fazer exatamente todo esse trabalho. O problema é que não consigo descobrir como fazê-lo funcionar como esperado.

Suponhamos que meu servidor seja executado em meu-domínio.com e que, para proxy e transformar o conteúdo de outro domínio, eu faça uma solicitação como esta:

my-domain.com/proxy?url=http://another-domain.com/some/content

Eu quero que mod_proxy_html veicule o conteúdo e reescreva os seguintes URLs em http://another-domain.com/some/content das seguintes maneiras:

  1. URLs absolutas que não são de another-domain.com : sem reescrever
  2. Relativo de URLs raiz: /other/content - > %código%
  3. URLs relativos: /proxy?url=http://another-domain.com/other/content - > %código%
  4. Relativo aos URLs pais: other/content - > %código%

A URL deve ser especificada em tempo de execução, não em tempo de configuração.

Isso pode ser conseguido com mod_proxy_html? Alguém poderia fornecer uma configuração de trabalho simples para começar?

EDITAR 1-PRIMEIRA ABORDAGEM

A seguinte configuração do site funcionará bem com sites que usam URL absoluto em todos os lugares, como /proxy?url=http://another-domain.com/some/content/other/content . Você pode tentar esta configuração no localhost: ../other/content

<VirtualHost *:80>
    ServerName localhost

    LogLevel debug

    ProxyRequests off
    RewriteEngine On
    RewriteRule ^/asset/(.*) $1 [P]
    ProxyHTMLURLMap $1 /asset/


    <Location /asset/>
            ProxyPassReverse /
        ProxyHTMLURLMap / /asset/
    </Location>
</VirtualHost>

Mas, como explicado na documentação , se eu acessar um site usando URL relativo, gostaria de tê-lo reescrito no html via mod_proxy_html. Por isso, mude o bloco /proxy?url=http://another-domain.com/some/other/content da seguinte forma:

    <Location /asset/>
            ProxyPassReverse /

            #Depending on your system use one line or the other
            #Ubuntu:
            #SetOutputFilter proxy-html
            #any other system:
            ProxyHTMLEnable On 

        ProxyHTMLURLMap / /asset/
    </Location>

... o que parece não funcionar. Comentários, sugestões e ideias são bem-vindos!

    
por Daniel Cerecedo 25.04.2013 / 01:53

1 resposta

2

Aqui está uma ideia de como fazer isso - é um pouco mais complexo na configuração, mas acho que seria seguro. No momento, não posso testar isso, pois não consigo acessar meu servidor de teste, mas é um começo.

O principal problema é que, se você simplesmente configurar um ProxyPassReverse, também precisará especificar a quais servidores você se conectará. Desde que você quer ser capaz de usar isso em vários servidores, isso seria um pouco doloroso, para dizer o mínimo. Então, aqui está uma abordagem de duas etapas para evitar esse problema.

Primeiro, configure uma instância separada do apache para ouvir somente no 127.0.0.1 e em uma porta específica - eu usei o 2323 no meu exemplo. Esta instância deve ser configurada como um servidor proxy direto e não precisa ser reescrita. Exemplo:

<Proxy *>
   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1
</Proxy> 

No seu servidor principal, configure um proxy reverso, algo assim:

<Location /proxy/>
    ProxyPass http://127.0.0.1:2323
    ProxyPreserveHost On
    ProxyHtmlEnable ON
    ProxyHtmlMap / /proxy/
</Location> 

Isso significará que o proxy real funciona como um proxy regular, enquanto a reescrita acontece na mesma instância do apache em que o script é executado. Novamente, observe que isso não foi testado, mas acho que é a direção certa para começar a procurar.

    
por 26.04.2013 / 09:59