Como lidar corretamente com URLs relativos com um proxy reverso

Como lidar corretamente com URLs relativos com um proxy reverso

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

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

Ele mapeia para: Servidor B com endereço test.madeupurl.com

Esse tipo de trabalho. Mas o problema que tenho é que, em www.example.com/folder, todos os links relativos têm os formatos www.example.com/css/examplefilename.css em vez de www.example.com/folder/css/examplefilename. css

Como faço para corrigir isso?

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

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>

Responder1

O Apache ProxyPassRewrite não reescreve os corpos de resposta recebidos dehttp://teste.exemplo.com, apenas cabeçalhos (como redirecionamentos para uma página 404 e outros).

Uma série de alternativas:

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

Dois) Reimplante o aplicativo interno no mesmo subdiretório, /folderem vez de na raiz de test.example.com.

Três) É improvável que um e dois aconteçam... Se você tiver sorte, o aplicativo interno usará apenas dois ou três subdiretóriose aqueles que não são utilizados em seu site principal, 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 reverta tudo com 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 fazem com que seus aplicativos não apenas gerem URLs absolutos, mas até incluam a parte do nome do host em seus URLs e o código HTML resultante fica assim: <img src=http://test.example.com/icons/logo.png>.

A) Você pode usar a solução combinada de DNS de horizonte dividido e cenário 4. Usuários internos e externos usam test.example.com, mas seu DNS interno aponta diretamente para o endereço IP do servidor test.example.com. Para usuários externos, o registro público de test.example.com aponta para o endereço IP do seu servidor web públicowww.exemplo.come você pode então usar a solução 4.

B) Na verdade, você pode fazer com que o Apache não apenas faça solicitações de proxy para test.example.com, mas tambémreescrever o corpo da respostaantes de ser transmitido aos seus usuários. (Normalmente, um proxy apenas reescreve cabeçalhos/respostas HTTP). mod_substitute no Apache 2.2. Não testei se ele combina bem com 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>

Edição tardia

Seis) Às vezes, os desenvolvedores fornecem configurações especiais de aplicativo especificamente para implantações em que o aplicativo está protegido por um proxy reverso.O aplicativo pode então ser configurado para gerar URLs auto-referenciais, com o protocolo, o nome do site e o caminho do URI que os usuários estão/deveriam usar, em vez deentão o nome do host, o protocolo e/ouo URI que o aplicativo detecta. Espere termos como external URL,. site URLEntão você não precisa resolver nada no Apache.

Responder2

Como complementoH Bruijnresposta, se você optar pela solução(3)"ProxyPass", você também pode ter que usarmod_proxy_htmlpara reescrever alguns URLs em suas páginas HTML.

cf.Como lidar corretamente com URLs relativos com um proxy reversopara alguns exemplos.

Como exemplo aplicado, aqui está como você pode configurar o Apache usando a ProxyHTMLURLMapregra para encaminhar tudo emseu-nome-dominio.com/padpara o seuÉterpadinstâ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]

Responder3

Você pode usar a seguinte maneira para criar um proxy reverso:
1. Instale mod_proxy_html

    yum install mod_proxy_html
  1. Carregar 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.

informação relacionada