Назад | Перейти на главную страницу

Изменить HTML-страницы, возвращаемые обратным прокси-сервером nginx

У меня есть установка обратного прокси-сервера для доступа к стороннему приложению, расположенному внутри интрасети, из Интернета. Допустим, это приложение находится по URL-адресу:

https://internalserver:8080/ (доступно только из интрасети)

и прокси включен:

https://proxyserver/ (доступен из любой точки мира)

Прокси-сервер управляется nginx и работает нормально. Когда пользователь обращается к https://proxyserver/ они получают содержимое приложения в https://internalserver:8080/.

Проблема в том, что приложение записывает абсолютные URL-адреса в ответ HTML, поэтому, когда пользователь щелкает ссылку на новую страницу, браузер пытается найти страницу с ее внутренним именем, например https://internalserver:8080/somepage вместо того https://proxyserver/somepage.

Я знаю, что это ошибка программы, но я не могу изменить программу.

Могу ли я перехватить ответ, изменить URL-адреса и отправить их (измененные) конечному клиенту с помощью nginx? Или, может быть, другим инструментом?

РЕДАКТИРОВАТЬ: Я видел этот вопрос раньше, но мой случай более конкретен, цитируемый вопрос требует общей модификации. В этом случае специальная программа fast-cgi является лучшим решением, мне нужно более конкретное решение для (я думаю) более распространенного сценария. хотя программа fast-cgi может работать, я ищу самое простое и, возможно, более сильное и проверенное на практике решение для этого сценария.

Вот официальное видео Nginx на YouTube, демонстрирующее встроенную перезапись контента.

https://youtu.be/7Y7ORypoHhE?t=20m22s

Действительно с sub_filter

http://nginx.org/en/docs/http/ngx_http_sub_module.html

В вашем случае вы смотрите на что-то вроде:

location / {
sub_filter_once off;
sub_filter_types text/html;
sub_filter "https://internalserver:8080" "https://proxyserver";
}

http://nginx.org/en/docs/http/ngx_http_sub_module.html

Модуль ngx_http_sub_module - это фильтр, который изменяет ответ, заменяя одну указанную строку другой.

Этот модуль не создается по умолчанию, его следует включить с помощью параметра конфигурации --with-http_sub_module.

Пример конфигурации

sub_filter      </head>
    '</head><script language="javascript" src="$script"></script>';