Cómo manejar correctamente las URL relativas con un proxy inverso

Cómo manejar correctamente las URL relativas con un proxy inverso

Tengo una configuración de proxy inverso de la siguiente manera en Apache:

El servidor A con dirección www.example.com/carpeta es el servidor proxy inverso.

Se asigna a: Servidor B con dirección test.madeupurl.com

Este tipo de obras. Pero el problema que tengo es que, en www.example.com/folder, todos los enlaces relativos tienen el formato www.example.com/css/examplefilename.css en lugar de www.example.com/folder/css/examplefilename. CSS

¿Cómo puedo solucionar esto?

Hasta ahora mi proxy inverso tiene esto en el Servidor A (www.example.com):

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

Respuesta1

Apache ProxyPassRewrite no reescribe los cuerpos de respuesta recibidos dehttp://prueba.ejemplo.com, solo encabezados (como redireccionamientos a una página 404 y demás).

Varias alternativas:

Uno) Reescriba la aplicación interna para usar rutas relativas en lugar de absolutas. es decir, ../css/style.cssen lugar de/css/style.css

Dos) Vuelva a implementar la aplicación interna en el mismo subdirectorio /folderen lugar de en la raíz de test.example.com.

Tres) Es poco probable que sucedan uno y dos... Si tiene suerte, la aplicación interna solo usa dos o tres subdirectoriosy esos no se utilizan en su sitio principal, simplemente escribe un montón de líneas 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/

cuatro) Cree un subdominio separado para la aplicación interna y simplemente invierta el proxy de todo:

<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) A veces los desarrolladores no tienen ni idea y hacen que sus aplicaciones no sólo generen URL absolutas sino que incluso incluyan la parte del nombre de host en sus URL y el código HTML resultante se ve así: <img src=http://test.example.com/icons/logo.png>.

A) Puede usar una solución combinada de un DNS de horizonte dividido y el escenario 4. Tanto los usuarios internos como los externos usan test.example.com, pero su DNS interno apunta directamente a la dirección IP del servidor de test.example.com. Para usuarios externos, el registro público de test.example.com apunta a la dirección IP de su servidor web público.www.ejemplo.comy luego puedes usar la solución 4.

B) De hecho, puede hacer que Apache no solo envíe solicitudes de proxy a test.example.com, sino tambiénreescribir el cuerpo de la respuestaantes de que sea transmitido a sus usuarios. (Normalmente, un proxy solo reescribe encabezados/respuestas HTTP). mod_sustituto en apache 2.2. No he probado si se combina bien con mod_proxy, pero tal vez lo siguiente 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>

Edición tardía

Seis) A veces, los desarrolladores proporcionan configuraciones de aplicación especiales específicamente para implementaciones en las que la aplicación está detrás de un proxy inverso.Luego, la aplicación se puede configurar para generar URL autorreferenciales, con el protocolo, el nombre del sitio y la ruta URI que los usuarios están o deberían usar, en lugar deluego el nombre del host, el protocolo y/oel URI que detecta la aplicación. Espere términos como external URL,. site URLEntonces no necesitas resolver nada en Apache.

Respuesta2

Como complemento aHBruijnLa respuesta, si optas por la solución.(3)"ProxyPass", es posible que también tengas que utilizarmod_proxy_htmlpara reescribir algunas URL en sus páginas HTML.

cf.Cómo manejar correctamente las URL relativas con un proxy inversopara algunos ejemplos.

Como ejemplo aplicado, aquí se explica cómo configurar Apache usando la ProxyHTMLURLMapregla para reenviar todo ensu-nombre-de-dominio.com/padpara ustedEtherpadinstancia que se ejecuta localmente en el puerto 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]

Respuesta3

Puede utilizar la siguiente forma para crear un proxy inverso:
1. Instale mod_proxy_html

    yum install mod_proxy_html
  1. Cargar módulo mod_proxy_html

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. Y use la siguiente configuración

    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 esto ayude.

información relacionada