GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo manejar URL relativas correctamente con un proxy inverso

Solución 1:

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

Varias alternativas:

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

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

Tres ) Uno y dos a menudo es poco probable que sucedan... Si tiene suerte, la aplicación interna solo usa dos o tres subdirectorios y esos no se usan en su sitio principal , simplemente escribe un montón de líneas de 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 todo el 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 ) A veces, los desarrolladores no tienen ni idea y hacer que sus aplicaciones no solo generen URL absolutas, sino que incluso incluyan la parte del nombre de host en sus URL y el código HTML resultante se vea así:<img src=http://test.example.com/icons/logo.png> .

A ) Puede usar la 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.example.com y luego puede 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én reescriba el cuerpo de la respuesta antes de que se transmita a sus usuarios. (Normalmente, un proxy solo reescribe encabezados/respuestas HTTP). mod_substitute en apache 2.2. No he probado si se combina bien con mod_proxy, pero tal vez funcione lo siguiente:

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

Solución 2:

Como complemento a la respuesta de HBruijn, si opta por la solución (3) "ProxyPass", es posible que también deba usar mod_proxy_html para reescribir algunas URL en sus páginas HTML.

cf. Cómo manejar direcciones URL relativas correctamente con un proxy inverso para algunos ejemplos.

Como ejemplo aplicado, así es como puede configurar Apache usando el ProxyHTMLURLMap regla para reenviar todo en your-domain-name.com/pad a su instancia de Etherpad ejecutándose 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]

Solución 3:

Puede usar la siguiente forma de hacer 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 esta ayuda.


Linux
  1. Cómo instalar Odoo 14 en CentOS 8 con Nginx como proxy inverso

  2. Cómo instalar Odoo 10 en Ubuntu 16.04 con Apache como proxy inverso

  3. Cómo instalar Odoo 11 en Ubuntu 16.04 con Nginx como proxy inverso

  4. Cómo instalar Odoo 10 en Ubuntu 16.04 con Nginx como proxy inverso

  5. Cómo instalar Odoo 12 en Ubuntu 18.04 con Apache como proxy inverso

Cómo configurar un proxy inverso Nginx

Cómo instalar Varnish Reverse Proxy con Nginx en Ubuntu 16.04 LTS

Autenticación HTTP básica con Nginx

Cómo instalar GlassFish con Nginx como proxy inverso en Debian 10

Cómo instalar WildFly con Nginx como proxy inverso en Debian 10

Cómo configurar Tomcat con Nginx como proxy inverso en Ubuntu 18.04