Como tratar os URLs relativos corretamente com um proxy reverso

43

Eu tenho uma configuração de proxy reverso da seguinte forma no Apache:

O servidor A com endereço www.example.com/folder é o servidor proxy reverso.

Mapeia para: Servidor B com endereço test.madeupurl.com

Esse tipo de trabalho. Mas o problema que eu tenho é, em www.example.com/folder, todos os links relativos são das formas www.example.com/css/examplefilename.css em vez de www.example.com/folder/css/examplefilename. css

Como corrijo isso?

Até agora, meu proxy reverso tem isso no servidor A (www.example.com):

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>
    
por Hard worker 17.12.2013 / 13:05

3 respostas

70

O Apache ProxyPassRewrite não reescreve os corpos de resposta recebidos do link , somente cabeçalhos (como redirecionamentos para uma página 404 e outros).

Várias alternativas:

Um ) Reescreva o aplicativo interno para usar caminhos relativos em vez de absolutos. ou seja, ../css/style.css em vez de /css/style.css

Dois ) Reimplante o aplicativo interno em um mesmo subdiretório /folder em vez de na raiz de test.example.com.

Três ) É improvável que um e dois ocorram ... Se você tiver sorte, o aplicativo interno usa apenas dois ou três subdiretórios e os que não são usados no seu principal site , basta escrever um monte de linhas ProxyPass:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

Quatro ) Crie um subdomínio separado para o aplicativo interno e simplesmente inverta tudo de proxy:

<VirtualHost *:80>
   ServerName app.example.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://test.internal.example.com/
   ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

Cinco ) Às vezes, os desenvolvedores são completamente ignorantes e têm seus aplicativos não apenas gerando URLs absolutos, mas incluindo a parte do nome do host em seus URLs e o código HTML resultante se parece com isso : <img src=http://test.example.com/icons/logo.png> .

A ) Você pode usar a solução combinada de um DNS e um cenário de split horizon. Ambos os usuários internos e externos usam o test.example.com, mas seu DNS interno aponta diretamente para o endereço IP do servidor do test.example.com. Para usuários externos, o registro público de test.example.com aponta para o endereço IP do seu servidor público www.example.com e você pode usar a solução 4.

B ) Você pode obter o apache não apenas para fazer proxy de solicitações para test.example.com, mas também reescrever o corpo da resposta antes que ele seja transmitido para o seu Comercial. (Normalmente, um proxy apenas reescreve cabeçalhos / respostas HTTP). mod_substitute no apache 2.2. Eu não testei se ele combina bem com o mod_proxy, mas talvez o seguinte funcione:

<Location /folder/>
  ProxyPass http://test.example.com/
  ProxyPassReverse http://test.example.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>
    
por 17.12.2013 / 13:36
7

Como complemento da resposta da HBruijn , se você optar pela solução (3) "ProxyPass", você também deve usar mod_proxy_html para reescrever alguns URLs nas suas páginas HTML .

cf. Como tratar URLs relativas corretamente com um proxy reverso para alguns exemplos.

Como um exemplo aplicado, aqui está como você pode configurar o Apache usando a regra ProxyHTMLURLMap para encaminhar tudo em seu-dominio-nome.com/pad para o seu Etherpad instância em execução localmente na porta 9001:

<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]

    
por 10.10.2014 / 02:27
2

Você pode usar o seguinte caminho para criar um proxy reverso:
1. Instale mod_proxy_html

    yum install mod_proxy_html
  1. Carregar o módulo mod_proxy_html

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. E use a seguinte configuração

    ProxyRequests off  
    ProxyPass /folder/  http://test.madeupurl.com  
    ProxyHTMLURLMap http://test.madeupurl.com  /folder  
    
    <Location /folder/>  
        ProxyPassReverse /  
        ProxyHTMLEnable On  
        ProxyHTMLURLMap  /  /folder/  
        RequestHeader    unset  Accept-Encoding  
    </Location>  
    

Espero que isso ajude.

    
por 08.05.2015 / 10:52