¿Cómo hacer que nginx reescriba URI en el contenido del cuerpo HTTP?

12

Este es un seguimiento de mi pregunta anterior sobre cómo Haga que el proxy 302 inverso de nginx redirija a una subcarpeta URI en lugar de a la raíz .

Tengo un servidor proxy nginx que utiliza el rewrite y proxy_pass Directivas para enviar solicitudes externas a una URL como https://domain.com/my/web/app/ a un servidor LAN interno en https://10.0.0.22/. Aquí está mi intento de representar la traducción en ASCII UML:

                                    .-------------.       .------------------.
                                    | Nginx proxy  |      | Local web server |
                                    | (domain.com) |      | (10.0.0.22)      |
                                    '-------------'       '------------------'
                                               |                 |
                                               |                 |
GET https://domain.com/my/web/app/ ----------->|                 |
                                               |---------------->| GET /
                                               |                 |
                                               |<----------------| 302 redirect /login.php
302 redirect /my/web/app/login.php <-----------|                 |
                                               |                 |
GET https://domain.com/my/web/app/login.php -->|                 |
                                               |---------------->| GET /login.php
                                               |                 |
                                               |<----------------| 200
HTML body content (images, CSS, links) <-------|

Aquí está el bloque de ubicación real en mi archivo de configuración nginx:

location ^~ /my/web/app/
{
    proxy_buffering   off;
    rewrite           /my/web/app/(.*) /$1 break;
    proxy_pass        https://10.0.0.22/;
    proxy_redirect    default;
}

Funciona muy bien para la traducción de URI entre las rutas de URI internas y externas para las solicitudes y respuestas HTTP, pero no se traduce ningún URI en el contenido HTML (imágenes del cuerpo, CSS, scripts).

Por ejemplo, las imágenes con rutas relativas incrustadas en la respuesta HTML, con URI como /images/logo.png, se devuelven al cliente web y se interpretan como https://domain.com/images/logo.png en lugar de https://domain.com/my/web/app/images/logo.png.

Puedo entender por qué está sucediendo esto, pero sería maravilloso si hubiera una manera de representar el contenido y las solicitudes de forma dinámica. ¿Hay alguna forma de que nginx también convierta URI incrustados en el contenido HTML? ¿Es posible analizar y actualizar dinámicamente el contenido HTML a medida que pasa a través del servidor proxy?

Steve HHH
fuente
2
¿Encontraste una solución? En caso afirmativo, ¿podría publicarlo como una respuesta?
Huygens

Respuestas:

5

La única solución a esto que he encontrado hasta ahora es la HttpSubsModule (ver también la página github ).

El módulo no forma parte de las fuentes oficiales de Nginx, por lo que probablemente necesitará compilarlo usted mismo para usar este módulo.

Rasjid Wilcox
fuente