web-dev-qa-db-fra.com

Comment faire pour que nginx réécrive les URI dans le contenu du corps HTTP?

C’est la suite de ma question précédente sur la procédure à suivre Faire en sorte que le proxy inverse nginx 302 soit redirigé vers un sous-dossier d’URI au lieu de la racine .

J'ai un serveur proxy nginx qui utilise les directives rewrite et proxy_pass pour adresser des demandes externes à une URL telle que https://domain.com/my/web/app/ sur un serveur de réseau local interne à https://10.0.0.22/. Voici ma tentative de représenter la traduction dans 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) <-------|

Voici le bloc d’emplacement réel dans mon fichier de configuration nginx:

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

Cela fonctionne très bien pour la traduction d'URI entre les chemins d'URI internes et externes pour les demandes et les réponses HTTP, mais les URI du contenu HTML (images de corps, CSS, scripts) ne sont pas traduits.

Par exemple, les images avec des chemins relatifs incorporés dans la réponse HTML, avec des URI tels que /images/logo.png, sont renvoyées au client Web et interprétées en tant que https://domain.com/images/logo.png au lieu de https://domain.com/my/web/app/images/logo.png.

Je peux comprendre pourquoi cela se produit, mais ce serait merveilleux s'il existait un moyen de solliciter dynamiquement le contenu ainsi que les demandes. Existe-t-il un moyen de faire en sorte que nginx convertisse également les URI incorporés dans le contenu HTML? Est-il possible d'analyser et de mettre à jour dynamiquement le contenu HTML lors de son passage sur le serveur proxy?

13
Steve HHH

La seule solution à ce problème que j’ai trouvée jusqu’à présent est le HttpSubsModule (voir aussi le page github ).

Le module ne fait pas partie des sources officielles de Nginx. Vous devrez donc probablement créer Nginx vous-même pour utiliser ce module.

5
Rasjid Wilcox