Назад | Перейти на главную страницу

Прокси-сервер с параметрами через proxypass / proxypassmatch без VirtualHost

Я долгое время пытался проксировать веб-сокет с его переменной sid на службу localhost, которая его обслуживает. Я искал решения далеко за пределами (включая множество вопросов здесь), но большинство из них предлагают использовать VirtualHost, что я не могу сделать, так как мне не нужен субдомен, а виртуальный хост для моего основного домена уже имеет прокси-пропуск.

Я либо вынужден сделать это в соответствии с директивой, как предлагается здесь, которая не вернула мне никаких результатов, либо отредактировать сам веб-узел, чего я тоже не могу сделать, поскольку приложение, которое я запускаю, имеет закрытый исходный код.

Я пробовал следующее:

ProxyPassMatch    "^/?type=player&EIO=3&transport=websocket&sid=(.*)$" "ws://127.0.0.1:3000/socket.io/?type=player&EIO=3&transport=websocket&sid=$1"
ProxyPassReverse  "^/?type=player&EIO=3&transport=websocket&sid=(.*)$" "wss://127.0.0.1:3000/socket.io/?type=player&EIO=3&transport=websocket&sid=$1"

но это не дало никакого рабочего результата. Я также пробовал использовать разные выражения регулярных выражений, указывая полный путь и даже указывая sid текущего веб-сокета, но ничего не помогло. Я всегда получаю в ответ ошибку 400 Bad request, и в журналах Apache2 ничего не связано.

Буду признателен за любую помощь.

Директива ProxyPassMatch не соответствует, потому что она соответствует только URL-пути, а не добавленной строке запроса, как вы пытаетесь сделать.

Чтобы сопоставить строку запроса и выполнить проксирование, вы можете использовать mod_rewrite, например:

RewriteCond %{QUERY_STRING} (^|&)type=player(&|$)
RewriteCond %{QUERY_STRING} (^|&)EIO=3(&|$)
RewriteCond %{QUERY_STRING} (^|&)transport=websocket(&|$)
RewriteCond %{QUERY_STRING} (^|&)sid=
RewriteRule ^/(.*) ws://127.0.0.1:3000/socket.io/$1 [P,QSA]

Или что-то вроде того. Увидеть mod_rewrite документы для деталей, в частности Флаг RewriteRule P. Использование нескольких условий на QUERY_STRING вместо одного позволяет параметрам соответствовать в любом порядке.

Это только эквивалент ProxyPass директива. Если тебе надо ProxyPassReverse тоже в Apache 2.4 вы можете добавить Директивы заголовка с выражениями:

Header edit Location backend frontend "expr=%{QUERY_STRING} =~ /(^|&)type=player(&|$)/ & ..."

и так далее, где backend и frontend являются регулярными выражениями для URL-адресов внутреннего и внешнего серверов соответственно. И аналогично для Content-Location и URI заголовки. В Apache 2.2 эквивалентом выражения является использование RewriteRule чтобы установить переменную среды и добавить env пункт к Header директива.

Смотрите также Настройка Apache2 для прокси-сервера WebSocket?.