Apache2 WebSockets обратный прокси по тому же URL

Как настроить Apache2 на прокси-соединение WebSocket (например, BrowserSync), если оно сделано по тому же URL-адресу, с той лишь разницей, что заголовок "Upgrade: websocket" и схема URL ws://?

например:

HTTP request:
GET http://example.com/browser-sync/socket.io/?... HTTP/1.1
...

WebSocket request:
GET ws://example.com/browser-sync/socket.io/?... HTTP/1.1
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
...

все примеры, которые я нахожу, перенаправляют только некоторый путь, например " ..."или" ProxyPass/ ws/ws:/ / пример.com/"

моя текущая конфигурация:

ProxyRequests off
<Location />
    ProxyPass http://127.0.0.1:3000/
    ProxyPassReverse /
</Location>

mod_proxy, mod_proxy_http и mod_proxy_wstunnel являются включен.

2 ответов


отвечаю сам себе.

используя RewriteEngine, подсказка, данная этот пост, и WebSocket рукопожатие спецификация:

RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:3000/ [P,L]

ProxyRequests off
<Location />
    ProxyPass http://127.0.0.1:3000/
    ProxyPassReverse /
</Location>

большое спасибо metalim! Я публикую полную конфигурацию здесь для справки:

<VirtualHost *>
    ServerName example.org
    ServerAlias *.example.org
    ServerAdmin sysadmin@example.org
    ProxyRequests Off
    ProxyPreserveHost On

    RewriteEngine On
    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteRule /(.*) ws://192.168.1.1/  [P,L]

    ProxyPass / http://192.168.1.1/ retry=1
    ProxyPassReverse / http://192.168.1.1/

    ErrorLog /var/log/apache2/example.org.error.log
    CustomLog /var/log/apache2/example.org.access.log combined
</VirtualHost>