ProxyPassMatch с ProxyPassReverse

люди, Мы пытаемся настроить обратный прокси-сервер 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/
ProxyPassReverse /APP http://localhost:8080/AppContext

мои вопросы:

  1. мне ProxyPassMatch исправить?
  2. мой ProxyPassReverse - это "статика". Как я могу сделать его осведомленным о потенциально переменном материале после /APP?

Спасибо за любую интуиция.

-Радж

1 ответов


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

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

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

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

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

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