我所依赖的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.c
, mod_proxy.c
和mod_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_/');