Apache mod_proxy:将安全的websocket转发到不安全的地方

我所依赖的websocket库( PHP-Websockets )还不支持安全套接字( wss )。 我的网站通过https ,所以我不能使用不安全的ws连接。

我正在尝试使用Apache的mod_proxy将来自浏览器的安全请求转发到客户端。

使用Javascript

 var ws = new Websocket('wss://example.com/_ws_/'); 

Apache虚拟主机

 ProxyPass "/_ws_/" "ws://127.0.0.1:8080/" ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/" # I've also tried "/_ws_/" "ws://example.com:8080/" Same error below 

尝试连接时,浏览器收到500 Server Error 。 日志显示:

没有协议处理程序对URL / _ws_ /有效。 如果您正在使用mod_proxy的DSO版本,请确保代理子模块包含在使用LoadModule的configuration中。

我已经确认,如果我删除了代理规则,请停止将用户redirect到https并尝试从浏览器连接到不安全的套接字: new Websocket('ws://example.com/') ,事情工作得很好。

我加载的Apache模块包括mod_ssl.cmod_proxy.cmod_proxy_http.c

Apache 2.4

为了使事情发挥作用,我还需要加载mod_proxy_wstunnel

一旦我这样做了,这个规则集就可以工作:(在接收和代理websocket请求的域的VirtualHost中)

 <IfModule mod_proxy.c> ProxyPass "/_ws_/" "ws://127.0.0.1:8080/" ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/" </IfModule> 

浏览器然后可以通过HTTPS端口联系后端WS服务器:

 var ws = new Websocket('wss://example.com/_ws_/');