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

Можно ли настроить NGINX или Apache как обратный прокси-сервер, который будет заменять URL-адреса в содержимом тела как во входящем, так и в исходящем направлениях?

В настоящее время у меня есть веб-приложение поставщика, которое помещает полные доменные имена в тела ответа (HTML, JavaScript, CSS). Например, запросы к "realserver.mycompany.com" будут содержать JavaScript с переменными, для которых задано значение https://realserver.mycompany.com/path/to/something. Я настроил сервер Apache в качестве обратного прокси. Директивы прокси не влияют на тела ответа, поэтому я включил mod_substitute, чтобы найти экземпляры «realserver.mycompany.com» и заменить его на «proxyserver.mycompany.com». Хотя это работает, он заставляет клиент браузера создавать запросы, содержащие «proxyserver.mycompany.com» как часть данных, когда серверная часть ожидает увидеть «realserver.mycompany.com». Поэтому мне нужно иметь возможность выполнять обратную замену содержимого запроса, которое я выполняю для тел ответа. Однако в документации для mod_substitute прямо указано, что он работает с телами ответа.

Вот конфигурация, которую я сейчас использую:

<Location "/">
RequestHeader unset Accept-Encoding
RequestHeader unset Accept
RequestHeader set Accept-Encoding "identity; q=1.0,*;q=0"

ProxyPass https://realserver.mycompany.com/
ProxyPassReverse https://realserver.mycompany.com/
Substitute "s|realserver.mycompany.com|proxyserver.mycompany.com|in"
FilterDeclare webtestOut
FilterProvider webtestOut SUBSTITUTE "%{Content_Type} = ~m|^application/.*|"
FilterProvider webtestOut SUBSTITUTE "%{Content_Type} =~ m|^text/.*|"
</Location>

Я не могу понять, как изменить экземпляры «proxyserver.mycompany.com» на «realserver.mycompany.com» перед передачей запроса на внутренний сервер. Я не привязан к apache. Если есть способ добиться этого с помощью NGINX, я буду рад это изменить.

Если вам нужно переписать контент, посмотрите на mod_proxy_html модуль.

Если у вас есть контроль над внутренним контентом, может быть лучше использовать относительные ссылки в контенте. Если требуется домен, то использование домена из запроса устраняет необходимость перезаписи. Просто передайте запрос обратно, не изменяя заголовок Host, и используйте этот домен для ссылок, которые включают этот домен.