ProxyPassMatch с ProxyPassReverse

Folks, Мы пытаемся настроить обратный прокси Apache для следующего сценария:

  • Входящие запросы принимают форму http://foo.com/APP/v1/main.html
  • Для некоторых серверов URL-адрес будет ссылаться на разную версию, например http://foo.com/APP/v2/main.html
  • Балансировщик нагрузки вверх (HAProxy) отправит запрос на правильный сервер, у которого будет обратный прокси-сервер Apache2, выходящий на сервер JBoss.
  • Когда запрос появится в Apache 2, он будет иметь путь запроса, например /APP/v1/main.html
  • Мы хотим, чтобы он (обратный) прокси выходил на http://localhost:8080/AppContext/main.html, независимо от фрагмента версии в URL (v1, v2 и т.д.).

Я пытаюсь сделать это так:

ProxyPassMatch ^/.*?/APP.*?/(.*)$ http://localhost:8080/AppContext/$1
ProxyPassReverse /APP http://localhost:8080/AppContext

Мои вопросы:

  • Правильно ли я использую ProxyPassMatch?
  • Мой ProxyPassReverse является "статическим". Как мне узнать о потенциально переменных материала после /APP?

Спасибо за любые идеи.

-Raj

Ответ 1

Вы близко, попробуйте немного изменить регулярное выражение, чтобы учесть фрагмент версии:

ProxyPassMatch ^/.*?/APP.*?/v[0-9]+/(.*)$ http://localhost:8080/AppContext/$1

ProxyPassReverse в основном обеспечивает переписывание полей заголовка местоположения на лету в ответах, заданных прокси-сервером. Поэтому, когда он возвращает 301 переадресацию, скажем, http://localhost:8080/AppContext/something, apache знает, чтобы изменить его на /APP/v1/something, поэтому информация за прокси не будет отображаться. Поскольку у вас есть динамический URL-адрес, используемый в обратном прокси, здесь у вас есть несколько вариантов. Вы можете отправить его на балансировщик HAProxy (не уверен, что это для вас), или вы можете просто выбрать один и надеяться на лучшее. Например, если у вас есть балансировщик нагрузки в /APP/balancer/, который затем отправляет запросы /APP/v1/, /APP/v2/, /APP/v3/ и т.д. Затем вы можете сделать это:

ProxyPassReverse /APP/balancer http://localhost:8080/AppContext

В противном случае вы можете просто указать его на один и надеяться на лучшее:

ProxyPassReverse /APP/v1 http://localhost:8080/AppContext