Как заставить nginx переписывать URI в содержимом тела HTTP?

13

Это продолжение моего предыдущего вопроса о том, как сделать так, чтобы обратный прокси-сервер nginx 302 перенаправлял в подпапку URI вместо root .

У меня есть прокси - сервер Nginx , который использует rewriteи proxy_passдирективу проксите внешние запросы к URL , как https://domain.com/my/web/app/на внутренний сервер локальной сети в https://10.0.0.22/. Вот моя попытка представить перевод в 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) <-------|

Вот фактический блок местоположения в моем файле конфигурации nginx:

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

Он отлично работает для преобразования URI между внутренними и внешними путями URI для HTTP-запросов и ответов, но любые URI в содержимом HTML (изображения тела, CSS, скрипты) не переводятся.

Например, изображения с относительными путями, встроенными в ответ HTML, с URI, такими как /images/logo.png, передаются обратно веб-клиенту и интерпретируются как https://domain.com/images/logo.pngвместо https://domain.com/my/web/app/images/logo.png.

Я могу понять, почему это происходит, но было бы замечательно, если бы был способ динамического прокси-контента и запросов. Есть ли способ заставить nginx также конвертировать URI, встроенные в контент HTML? Можно ли динамически анализировать и обновлять содержимое HTML при его прохождении через прокси-сервер?

Стив ХХХ
источник
2
Вы нашли решение? Если да, можете ли вы опубликовать это как ответ?
Гюйгенс

Ответы:

5

Единственное решение, которое я нашел до сих пор, - это HttpSubsModule (см. Также страницу github ).

Модуль не является частью официальных источников Nginx, поэтому вам, вероятно, потребуется собрать Nginx самостоятельно, чтобы использовать этот модуль.

Расджид Уилкокс
источник