Я периодически использую в Apache модуль mod_proxy_http для проксирования трафика с одного frontend’а на различные backend’ы. Конфигурация, которая перебрасывает запросы с http://company.com/news/ на внутренний сервер http://internal.company.com/ такая:
ProxyPass /news/ http://internal.company.com/ ProxyPassReverse /news/ http://internal.company.com/
Всё работает хорошо, до тех пор, пока на внутреннем сервере вместо относительных URL вида “/css/style.css” не появляются абсолютные URL “http://internal.company.com/css/style.css”. В этом случае html возвращается внешнему клиенту, он пытается взять css/js или перейти по внутреннему адресу http://internal.company.com, который недоступен из Интернет, и на этом всё заканчивается. Страницы не отображаются, ссылки не работают.
Приходилось выкручиваться с прописыванием внешних URL на внутренних серверах, это рождало проблемы доступа из внутренней сети. Они лечились
Сегодня мне снова понадобилось решить эту задачу. Провёл изучение текущего состояния вопроса и нашёл отличное решение –
Теперь конфигурация выглядит примерно так:
ProxyPass /news/ http://internal.company.com/ ProxyPassReverse /news/ http://internal.company.com/ AddOutputFilterByType SUBSTITUTE text/html Substitute "s|http://internal.company.com/|http://company.com/news/|in"
Замечу – нагрузка на сервер минимальна, нужно переписывать только text/html. Для других случаев понадобится более расширенная конфигурация. Но направление решения вопроса я показал, от чего-то уже можно оттолкнуться.