У меня проблемы с относительными перенаправлениями, работающими с Apache и ProxyPassReverse. Если я на внутреннем сервере использую абсолютные перенаправления, т.е. Location: http://fake.frontend.com/cat
, все проксируется, как и предполагалось, однако, если я на внутреннем сервере использую относительные перенаправления, т.е. Location: /cat
не работает.
Я использую Apache 2.4.25 на Debian.
У меня есть следующая конфигурация на прокси-сервере:
<Location /test/>
ProxyPass http://fake.backend.local/
ProxyPreserveHost Off
ProxyPassReverse http://fake.backend.local/
SetOutputFilter INFLATE;proxy-html;DEFLATE
ProxyHTMLURLMap / /cat/
ProxyHTMLURLMap fake.backend.local/ /cat/
ProxyHTMLDocType "<!DOCTYPE html>"
</Location>
Когда я обращаюсь к прокси-серверу на http://fake.frontend.com/cat/
, внутренний сервер перенаправляется в зависимости от того, вошел он в систему или нет. Если я не авторизовался, меня перенаправляют (302) на /Signin
. Если я авторизован, меня перенаправляют (302) на /dashboard
. Если серверное приложение использует абсолютные пути в заголовке местоположения, например: http://fake.backend.local/Signin
I, тогда браузер загружает http://fake.frontend.com/cat/Signin
как и предполагалось. Однако, если внутреннее приложение использует относительные пути в заголовке местоположения, то есть: /Signin
браузер загружает http://fake.frontend.com/Signin
(обратите внимание на отсутствующую кошку).
Я хочу использовать относительные пути на бэкенде и по-прежнему перенаправляться на http://fake.frontend.com/cat/Signin
. Как настроить прокси для работы с заголовками относительного местоположения?
Я нашел и статья на сайте askapache.com, в котором был пример, где нужно установить ProxyPassReverse
на /
.
Переход на следующую конфигурацию решил мою проблему:
<Location /test/>
ProxyPass http://fake.backend.local/
ProxyPreserveHost Off
ProxyPassReverse /
SetOutputFilter INFLATE;proxy-html;DEFLATE
ProxyHTMLURLMap / /cat/
ProxyHTMLURLMap fake.backend.local/ /cat/
ProxyHTMLDocType "<!DOCTYPE html>"
</Location>