Websocket Proxy com parâmetros através de proxypass / proxypassmatch sem um VirtualHost

3

Eu tenho tentado por mais tempo para proxy um websocket com sua variável sid para o serviço localhost, que está servindo. Eu procurei muito além para uma solução (incluindo muitas das perguntas aqui), mas a maioria deles sugere usar um VirtualHost, o que eu não posso fazer, já que eu não quero um subdomínio e o virtualhost para meu domínio principal já tem um proxypass.

Eu sou forçado a fazê-lo sob uma diretiva, como sugerido aqui, que não me rendeu nenhum resultado, ou edite o websocket em si, o que eu não posso fazer, devido ao aplicativo que estou executando sendo de código fechado.

Eu tentei o seguinte:

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"

mas não estava fornecendo nenhum resultado de trabalho. Eu tentei com expressões regex diferentes também, especificando o caminho completo e até mesmo especificando o sid atual do websocket, mas nada funcionou. Eu sempre recebo um erro de solicitação Bad 400 em resposta e nada relacionado nos logs do Apache2.

Eu gostaria de receber ajuda.

    
por Wax 05.02.2018 / 15:51

1 resposta

1

A diretiva ProxyPassMatch não é compatível, pois ela só é compatível com o caminho da URL, não com a string de consulta anexada, como você está tentando fazer.

Para coincidir com a string de consulta e fazer o proxy, você pode usar mod_rewrite, por exemplo:

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]

Ou algo parecido. Consulte os documentos do mod_rewrite para obter detalhes, em particular o Sinalizador RewriteRule P . Usar várias condições em QUERY_STRING em vez de uma permite que os parâmetros correspondam em qualquer ordem.

Isso só faz o equivalente da diretiva ProxyPass . Se você precisar de ProxyPassReverse também, no Apache 2.4 você pode adicionar Diretrizes de cabeçalho com expressões :

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

e assim por diante, onde backend e frontend são regexes para as URLs dos servidores back e front end, respectivamente. E da mesma forma para os cabeçalhos Content-Location e URI . No Apache 2.2, o equivalente da expressão é usar o RewriteRule para definir uma variável de ambiente e adicionar uma cláusula env à diretiva Header .

Veja também Configurando o Apache2 para o proxy WebSocket? .

    
por 05.02.2018 / 18:25