Как переписать заголовок ответа Location в настройке прокси с Apache?

У меня есть основной прокси-сервер, который отправляет запросы на дополнительный прокси-сервер, на котором установлен OpeenSSO.

Если агент OpenSSO определяет, что пользователь не вошел в систему, он вызывает перенаправление 302 на сервер аутентификации и предоставляет исходный (закодированный) URL-адрес, который пользователь запросил в качестве параметра GET в заголовке местоположения перенаправления.

Однако URL-адрес в переменной GET - это адрес внутреннего (вторичного) прокси-сервера, а не исходного прокси-сервера. Поэтому я хотел бы отредактировать/переписать заголовок ответа "Местоположение", чтобы получить правильный URL.

Э.Г.

  1. http://a.com/hello/  (Оригинальный запрошенный URL)
  2. http://a.com/hello2/  (Вторичный прокси с агентом OpenSSO)
  3. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello2%2F  (302 перенаправить на сервер авторизации с запрошенным URL второго прокси-сервера, закодированного в переменной GET)
  4. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello%2F  (Закодированный URL переписывается на исходный запрос)

Я безуспешно перепробовал все комбинации заголовков и переписываний, поэтому думаю, что это невозможно. Самое близкое, что я получил, было это, но функция редактирования mod_headers не анализирует переменные окружения.

# On the primary proxy.
RewriteEngine On
RewriteRule ^/(.*)$ - [E=orig_request:$1,P]
Header edit Location ^(http://auth\.a\.com/login/\?orig_request=).*$ "$1http%3A%2F%2Fa.com%2F%{orig_request}e"

Ответ 1

ProxyPassReverse

ProxyPassReverse должен сделать это для вас:

Эта директива позволяет Apache настраивать URL-адреса в заголовках Location, Content-Location и URI в ответах HTTP-перенаправления.

Я не уверен, почему ваш обратный прокси-сервер не ведет себя таким образом, предполагая, что вы используете пару директив ProxyPass и ProxyPassReverse для его определения.

Редактирование заголовка местоположения

Если вы хотите иметь возможность редактировать заголовок Location, как вы описываете, вы можете сделать это с Apache 2.4.7:

Для редактирования есть как аргумент-значение, являющееся регулярным выражением, так и дополнительная замещающая строка. Начиная с версии 2.4.7 строка замены может также содержать спецификаторы формата.

"Спецификаторы формата", упомянутые в документах, включают в себя возможность использования переменных среды, например, %{VAR}e.

Возможно, вы также захотите изменить свое приложение так, чтобы параметр URL-адреса orig_request был релятивизирован, что потенциально устраняет необходимость редактирования заголовка с помощью переменных среды.

Заголовок расположения относительного пути

Вы также можете попробовать использовать относительный путь в заголовке Location, что избавит вас от необходимости явно отображать один домен на другой. Это официально действует с RFC 7231 (июнь 2014 г.), , но была широко поддержана еще до этого. Вы можете релятивизировать свой заголовок Location с помощью директив Apache Header edit (даже до версии 2.4.7, поскольку для этого не требуется подстановка переменных среды). Это будет выглядеть примерно так:

Header edit Location "(^http[s]?://)([a-zA-Z0-9\.\-]+)(:\d+)?/" "/"