【问题标题】:Apache + Socket.io result in error establishing websocket connection on MacApache + Socket.io 导致在 Mac 上建立 websocket 连接时出错
【发布时间】:2018-10-05 19:59:05
【问题描述】:

我有 node.js 和 socket.io 模块,教程聊天示例在 localhost:3000 上完美运行。

我也有 Apache 服务器,我将所有的 php 文件用于该项目。服务器在 localhost:8080 上运行良好。

该项目的一部分是通过在 Apache 服务器上由 compose.php 脚本创建的页面中的表单上按下发送按钮来传达消息。推送发送时,必须建立 websocket 连接(如果尚未建立)并发送测试发射。就像教程聊天示例一样。但这永远不会发生。

在检查 Chrome 控制台/网络上的问题时,错误是:

控制台:

WebSocket connection to 'ws://localhost:8080/socket.io/?EIO=3&transport=websocket&sid=dhRg2iHG7dJqL3JEAAF4' failed: Error during WebSocket handshake: Unexpected response code: 302

网络:

第一:

Request URL: ws://localhost:8080/socket.io/?EIO=3&transport=websocket&sid=BFoFZNDQamsdNurlAAIr
Request Method: GET
Status Code: 302 Found
Content-Length: 273
Content-Type: text/html; charset=iso-8859-1
Date: Sat, 29 Sep 2018 11:43:07 GMT
Location: ws://localhost:3000/socket.io/?EIO=3&transport=websocket&sid=BFoFZNDQamsdNurlAAIr
Server: Apache/2.4.33 (Unix) OpenSSL/1.0.2o PHP/7.2.6 mod_perl/2.0.8-dev Perl/v5.16.3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ru;q=0.8,ja;q=0.7,uk;q=0.6
Cache-Control: no-cache
Connection: Upgrade
Cookie: PHPSESSID=aaa8a06d8e58534d5ebbe62919085074; io=BFoFZNDQamsdNurlAAIr
Host: localhost:8080
Origin: http://localhost:8080
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: WqB/VJfA2Fx/+0BrcHPnBA==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
EIO: 3
transport: websocket
sid: BFoFZNDQamsdNurlAAIr

然后:

Request URL: http://localhost:3000/socket.io/?EIO=3&transport=polling&t=MOb913S&sid=BFoFZNDQamsdNurlAAIr
Request Method: GET
Status Code: 500 Internal Server Error
Remote Address: [::1]:3000
Referrer Policy: no-referrer-when-downgrade
Connection: keep-alive
Date: Sat, 29 Sep 2018 11:43:32 GMT
Transfer-Encoding: chunked
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ru;q=0.8,ja;q=0.7,uk;q=0.6
Connection: keep-alive
Content-type: text/plain;charset=UTF-8
Cookie: PHPSESSID=aaa8a06d8e58534d5ebbe62919085074; io=BFoFZNDQamsdNurlAAIr
Host: localhost:3000
Origin: http://localhost:8080
Referer: http://localhost:8080/compose.php?crate_id=53
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
EIO: 3
transport: polling
t: MOb913S
sid: BFoFZNDQamsdNurlAAIr

我在 .htaccess 中的重写规则设置是这样的:

RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule ^/?socket.io ws://localhost:3000/socket.io/ 
RewriteRule ^/?socket.io http://localhost:3000/socket.io/ 

我几乎可以肯定问题出在我将 socket.io 调用从 localhost:8080 重定向到 localhost:3000 的方式上。我只是在网络上很糟糕,完全不明白这一点。我尝试了不同的配置,包括 httpd.conf 中的代理和反向代理设置,例如:

<IfModule proxy_module>
ProxyRequests Off
ProxyPass /socket.io http://localhost:3000/socket.io/
ProxyPassReverse /socket.io http://localhost:3000/socket.io/
</IfModule>

我已经尝试修复此问题 2 周了,这让我发疯了。如何让 localhost:3000 上的 socket.io 根据来自 localhost:8080/compose.php 的页面的请求发出信息?

【问题讨论】:

    标签: node.js apache socket.io xampp


    【解决方案1】:

    由于我在生活中没有做的大多数事情,解决方案非常简单。

    在 .js 文件中运行 socket = io(); 时,由 Apache 服务器提供服务,套接字对象设置为 uri,它是 Apache 服务器的 uri,在我的例子中是 localhost:8080。

    通过添加这一行

    socket.io.uri = "http://localhost:3000/";
    

    问题解决了。无法立即建立连接,但会在尝试重新连接时建立。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2018-06-13
      • 2021-05-29
      • 2012-07-13
      • 2018-02-05
      • 2022-12-15
      • 2021-03-13
      相关资源
      最近更新 更多