Come fare in modo che nginx riscriva gli URI nel contenuto del corpo HTTP?


13

Questo è un seguito alla mia precedente domanda su come fare in modo che il reindirizzamento 302 del proxy inverso nginx reindirizzi a una sottocartella URI anziché a root .

Ho un server proxy nginx che utilizza le direttive rewritee proxy_passper delegare le richieste esterne a un URL come https://domain.com/my/web/app/a un server LAN interno all'indirizzo https://10.0.0.22/. Ecco il mio tentativo di rappresentare la traduzione in 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) <-------|

Ecco l'effettivo blocco di posizione nel mio file di configurazione nginx:

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

Funziona benissimo per la traduzione di URI tra i percorsi URI interni ed esterni per richieste e risposte HTTP, ma tutti gli URI nel contenuto HTML (immagini del corpo, CSS, script) non vengono tradotti.

Ad esempio, le immagini con percorsi relativi incorporati nella risposta HTML, con URI come /images/logo.png, vengono restituite al client Web e interpretate come https://domain.com/images/logo.pnganziché https://domain.com/my/web/app/images/logo.png.

Posso capire perché questo stia accadendo, ma sarebbe meraviglioso se ci fosse un modo per delegare dinamicamente il contenuto e le richieste. C'è un modo per ottenere nginx per convertire anche gli URI incorporati nel contenuto HTML? È possibile analizzare e aggiornare dinamicamente il contenuto HTML mentre passa attraverso il server proxy?


2
Hai trovato una soluzione? Se sì, potresti pubblicarlo come risposta?
Huygens,

Risposte:


5

L'unica soluzione a questo che ho trovato finora è HttpSubsModule (vedi anche la pagina github ).

Il modulo non fa parte delle fonti ufficiali di Nginx, quindi probabilmente dovrai creare Nginx tu stesso per usare questo modulo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.