У меня есть установка обратного прокси-сервера для доступа к стороннему приложению, расположенному внутри интрасети, из Интернета. Допустим, это приложение находится по 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>';