Я долгое время пытался проксировать веб-сокет с его переменной 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 ничего не говорится.
Буду признателен за любую помощь.
Директива 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? .