Jak sprawić, by Nginx przepisał URI w treści HTTP?

14

Jest to kontynuacja mojego wcześniejszego pytania, jak przekierować nginx odwrotne proxy 302 do podfolderu URI zamiast root .

Mam serwer proxy Nginx, który korzysta z dyrektyw rewritei proxy_passdo proxy zewnętrznych żądań do adresu URL, jak https://domain.com/my/web/app/na wewnętrzny serwer LAN pod adresem https://10.0.0.22/. Oto moja próba przedstawienia tłumaczenia w 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) <-------|

Oto rzeczywisty blok lokalizacji w moim pliku konfiguracyjnym nginx:

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

Działa doskonale do tłumaczenia URI między wewnętrznymi i zewnętrznymi ścieżkami URI dla żądań i odpowiedzi HTTP, ale żadne URI w treści HTML (obrazy ciała, CSS, skrypty) nie są tłumaczone.

Na przykład obrazy z względnymi ścieżkami osadzonymi w odpowiedzi HTML, z identyfikatorami URI takimi jak /images/logo.png, są przekazywane z powrotem do klienta WWW i interpretowane jako https://domain.com/images/logo.pngzamiast https://domain.com/my/web/app/images/logo.png.

Rozumiem, dlaczego tak się dzieje, ale byłoby wspaniale, gdyby istniał sposób na dynamiczne zastępowanie treścią proxy oraz żądaniami. Czy istnieje sposób, aby Nginx konwertował również identyfikatory URI osadzone w treści HTML? Czy jest możliwe dynamiczne analizowanie i aktualizowanie treści HTML podczas przechodzenia przez serwer proxy?

Steve HHH
źródło
2
Znalazłeś rozwiązanie? Jeśli tak, czy możesz to opublikować jako odpowiedź?
Huygens

Odpowiedzi:

5

Jedynym rozwiązaniem, które do tej pory znalazłem, jest HttpSubsModule (patrz także strona github ).

Moduł nie jest częścią oficjalnych źródeł Nginx, więc prawdopodobnie będziesz musiał samodzielnie zbudować Nginx, aby móc korzystać z tego modułu.

Rasjid Wilcox
źródło