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

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

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

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

E.g.

  1. http://a.com/hello/ (исходный запрошенный URL)
  2. http://a.com/hello2/ (дополнительный прокси с агентом OpenSSO)
  3. http://auth.a.com/login/?orig_request=http://a.com/hello2/ (302 перенаправление на сервер аутентификации с запрошенным URL-адресом второго прокси-сервера, закодированным в переменной GET)
  4. http://auth.a.com/login/?orig_request=http://a.com/hello/ (Закодированный 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"

person xeonman9000    schedule 30.04.2013    source источник


Ответы (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+)?/" "/"
person BrianV    schedule 05.03.2015
comment
Спасибо за предложение просто отредактировать заголовок местоположения напрямую! - person gaqzi; 01.12.2015
comment
ProxyPassReverse, похоже, не работает для 201 Created. Любой обходной путь для этого? - person Jochen Bedersdorfer; 22.11.2016
comment
Регулярное выражение для редактирования заголовка Location не удаляет двоеточие и порт. Вместо этого я успешно использовал это: Header edit Location "(^http[s]?://)([^/]+)" "" - person grtjn; 20.04.2017
comment
Я обнаружил, что использование ProxyPassReverse в блоке Location приводит к тому, что перенаправление возвращается на IP-адрес балансировщика нагрузки в цепочке прокси, а не на внешнее полное доменное имя. Использование Header edit Location сработало отлично и в любом случае кажется более интуитивным. Спасибо за ваш пост. - person halfer; 12.07.2018