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

12

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

Eu tenho um servidor proxy nginx que usa as diretivas rewrite e proxy_pass para fazer proxy de solicitações externas para uma URL como https://domain.com/my/web/app/ para um servidor da LAN interno em https://10.0.0.22/ . Aqui está minha tentativa de representar a tradução em UML ASCII:

                                    .-------------.       .------------------.
                                    | 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;
}

Funciona muito bem para a conversão de URI entre os caminhos URI internos e externos para solicitações e respostas HTTP, mas quaisquer URIs no conteúdo HTML (imagens do corpo, 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 passadas de volta para o Web client e interpretadas como https://domain.com/images/logo.png em vez de https://domain.com/my/web/app/images/logo.png .

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

    
por Steve HHH 20.12.2013 / 01:52

1 resposta

5

A única solução que encontrei até agora é o HttpSubsModule (veja também o github page ).

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

    
por 21.05.2014 / 16:18