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