WebSocket握手期间Socket.io代码200错误

WebSocket握手期间Socket.io代码200错误,socket.io,apache2,Socket.io,Apache2,我正在使用带有nodejs的socket.io,并在其上安装一个apache服务器。 我得到一个代码200作为回应,我知道我必须得到101 WebSocket连接到 'wss://SITEABC.com/socket.io/?siteId=site1234567&EIO=3&transport=websocket' 失败:WebSocket握手期间出错:状态行无效 apache上的配置如下所示: RewriteCond %{HTTP:Upgrade} ^Websocket [NC] Rewrit

我正在使用带有nodejs的socket.io,并在其上安装一个apache服务器。 我得到一个代码200作为回应,我知道我必须得到101

WebSocket连接到 'wss://SITEABC.com/socket.io/?siteId=site1234567&EIO=3&transport=websocket' 失败:WebSocket握手期间出错:状态行无效

apache上的配置如下所示:

RewriteCond %{HTTP:Upgrade} ^Websocket [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:1337/{REQUEST_URI} [P]

RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

ProxyPass / http://localhost:1337/
ProxyPassReverse / http://localhost:1337/
ProxyPass /socket.io/ http://localhost:1337/socket.io/

节点正在端口1337上运行这意味着您的请求不会被代理给WebSocket处理程序,而是针对返回200的其他路由


您应该检查WebSocket处理程序。

我使用springboot 2+stomp。 在我的例子中,原因是在WebSocketConfig中,必须删除

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*")
                .addInterceptors(new HandshakeInterceptor())

                //--> important must remove,or 200 error.
                //.withSockJS()

                ;
    }

我也有同样的问题。您能详细说明一下吗?在我的例子中,请求的WebSocket请求协议已从ws://更改为http://这避免了将请求路由到后端的特定WebSocket处理程序。我有一个运行的NodeJS服务器,用于处理WebSocket调用。在握手完成之前,它无法开始发送ws://etc调用。在返回101状态行之前,握手不会完成。它当然接收请求,因为当它无法完成握手时,它会返回到Ajax中。返回Ajax..是的。但实际上是客户端的socket.io库发出了Ajax调用。。因为它无法完成WebSocket握手……是的,我理解这一部分,很抱歉我的措辞让它听起来像是服务器在进行Ajax调用。问题在于我正在做的ProxyPass。我决定将节点服务器从Apache服务器后面拉出来,让应用程序在不同的端口上调用节点服务器。问题解决了:)这里的问题是一样的。在那之后,一切都好了。