У меня есть Apache/2.4.6, работающий как обратный прокси для некоторых приложений. Теперь мне нужно настроить еще один. HTTP-прокси работает отлично, но в некоторых разделах веб-страницы клиент пытается запустить соединение websocket.
Проблема в том, что URL-адрес частично общий:
HTTP-запрос:http://domain/context/[whatever]
Запрос WS:ws://domain/context/specific-text?param1¶m2
Невозможно использовать If
(проверка протокола), так как ProxyPass не может войти внутрь <If>
.
Попробовал установить:
<Location /context/specific-text>
ProxyPass ws://internal.domain/context/specific-text
До
<Location /context/>
ProxyPass http://internal.domain/context/
Но это не работает, полагаю, из-за (несуществующего) завершающего слеша.
Дополнительные данные:
- Сокет жалуется на то, что не принимает код «200», Apache не возвращает ws-соединение, но в какой-то момент проксирование выполняется.
- Пробовал и с и без
<Location>
- Думал переписать
specific-text
,specific-text/
но мне не нравится манипулировать вещами, которыми я не управляю. Приложение платное, не могу спросить, навредит ли оно чему-нибудь. Ну, я мог бы, просто не стал бы ожидать ответа.
решение1
Мне подходит следующий фрагмент конфигурации ProxyPass:
ProxyPass /specific wss://0.0.0.0:4000/specific
ProxyPassReverse /specific wss://0.0.0.0:4000/specific
ProxyPass / https://0.0.0.0:4000/
ProxyPassReverse / https://0.0.0.0:4000/
Заказ директив ProxyPass
Настроенные правила ProxyPass и ProxyPassMatch проверяются в порядке настройки. Первое совпавшее правило побеждает.