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

17

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

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

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

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

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

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

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

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

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

PCJ
источник
1
возможный дубликат данных Modify, передаваемых nginx на лету
Cristian Ciupitu

Ответы:

16

Вот официальное видео 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";
}
JayMcTee
источник
3

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>';
Воронцовский
источник