2017-04-21 103 views
2

在客户端,我想建立WSS连接:的WebSocket通过与Apache的SSL反向代理

var ws = new WebSocket("wss://wsserver.com/test")

并返回一个错误:

WebSocket connection to 'wss://wsserver.com/test' failed: Error during WebSocket handshake: Unexpected response code: 400

全标头为:

请求标头

GET wss://wsserver.com/test HTTP/1.1 
Host: wsserver.com 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 
Origin: https://website.net 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch, br 
Accept-Language: en-US,en;q=0.8 
Sec-WebSocket-Key: Tj9AJ5TKglNf5LoHsQTpvQ== 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

响应头

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Origin:https://website.net 
Connection:close 
Content-Length:18 
Content-Type:text/plain; charset=utf-8 
Date:Fri, 21 Apr 2017 21:03:45 GMT 
Server:Apache/2.4.18 (Ubuntu) 
Vary:Origin 
X-Content-Type-Options:nosniff 

服务器端是在旅途中,在8888端口上运行Apache的背后反向代理。这是Apache配置:

<VirtualHost *:443> 
     ServerName website.com 

     ProxyPreserveHost On 
     ProxyRequests Off 
     ProxyPass "/" "wss://localhost:8888/" 

的mod_proxymod_proxy_wstunnel安装

这儿有什么遗漏吗?似乎请求已经通过,但没有建立连接。

+1

'lcalhost'?这是一个错字吗? –

+0

是的,的确,这是一个错字,但它没有解决我的问题 –

回答

3

我结束了使用此配置的虚拟主机,使用HTTP标头,其过滤请求解决这个问题:

<VirtualHost *:443> 
    ServerName website.com 

    RewriteEngine On 

    # When Upgrade:websocket header is present, redirect to ws 
    # Using NC flag (case-insensitive) as some browsers will pass Websocket 
    RewriteCond %{HTTP:Upgrade} =websocket [NC] 
    RewriteRule ^/ws/(.*) wss://localhost:8888/ws/$1 [P,L] 

    # All other requests go to http 
    ProxyPass "/" "http://localhost:8888/" 

我离开这个作为参考的情况下,它可以帮助别人