Como fazer nginx reescrever URIs no conteúdo do corpo HTTP?


13

Esta é uma continuação da minha pergunta anterior sobre como fazer o proxy reverso nginx 302 redirecionar para uma subpasta URI em vez de raiz .

Eu tenho um servidor proxy nginx que usa as diretivas rewritee proxy_passpara proxy de solicitações externas para um URL como https://domain.com/my/web/app/um servidor LAN interno em https://10.0.0.22/. Aqui está minha tentativa de representar a tradução em 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) <-------|

Aqui está o bloco de localização real no meu arquivo de configuração nginx:

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

Ele funciona muito bem na tradução de URI entre os caminhos interno e externo de URI para solicitações e respostas HTTP, mas quaisquer URIs no conteúdo HTML (imagens corporais, CSS, scripts) não são traduzidos.

Por exemplo, imagens com caminhos relativos incorporados na resposta HTML, com URIs como /images/logo.png, são transmitidas de volta ao cliente da Web e interpretadas como em https://domain.com/images/logo.pngvez de https://domain.com/my/web/app/images/logo.png.

Entendo por que isso está acontecendo, mas seria maravilhoso se houvesse uma maneira de proxy de conteúdo e solicitações dinamicamente. Existe uma maneira de fazer com que o nginx também converta URIs incorporados no conteúdo HTML? É possível analisar e atualizar dinamicamente o conteúdo HTML à medida que ele passa pelo servidor proxy?


2
Você encontrou uma solução? Se sim, você poderia publicá-lo como resposta?
Huygens

Respostas:


5

A única solução para isso que encontrei até agora é o HttpSubsModule (veja também a página do github ).

O módulo não faz parte das fontes oficiais do Nginx, portanto você provavelmente precisará criar o Nginx para usar este módulo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.