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

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

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

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

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 ничего не говорится.

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

2
задан 5 February 2018 в 16:51
1 ответ

Директива 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? .

1
ответ дан 3 December 2019 в 12:33

Теги

Похожие вопросы