Côté client, j'essaie d'établir la connexion wss:
var ws = new WebSocket("wss://wsserver.com/test")
et il renvoie une erreur:
WebSocket connection to 'wss://wsserver.com/test' failed: Error during WebSocket handshake: Unexpected response code: 400
Les en-têtes complets sont:
En-têtes de demande
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
En-têtes de réponse
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
Le côté serveur est en cours d'exécution sur le port 8888 derrière un proxy inverse Apache. Voici la configuration Apache:
<VirtualHost *:443>
ServerName website.com
ProxyPreserveHost On
ProxyRequests Off
ProxyPass "/" "wss://localhost:8888/"
mod_proxy et mod_proxy_wstunnel sont installés.
Y a-t-il quelque chose qui manque ici? Il semble que la demande passe mais aucune connexion n'est établie.
J'ai fini par résoudre ce problème en utilisant cette configuration pour l'hôte virtuel, qui filtre les demandes à l'aide des en-têtes 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/"
Je laisse cela comme référence au cas où cela aiderait les autres
Commentaire de @ pimgeek:
Je pense qu'au lieu de RewriteRule ^/nodered/comms wss://localhost:1880/nodered/comms [P,L]
vous auriez pu utiliser 1 $ comme suit: RewriteRule ^/nodered/comms$ wss://localhost:1880/$1 [P,L]
Cela devrait également fonctionner: RewriteRule ^/nodered/comms$ wss://localhost:1880$1 [P,L]
Notez le non nécessaire/après le port, car $ 1 inclut déjà un/au début