socket.io URI请求中缺少正斜杠会导致连接失败

时间:2015-09-08 16:05:45

标签: node.js socket.io haproxy

有时,当我连接到执行上述客户端请求的特定网页时,我会看到一些404 Not Found错误,前面是301 Moved Permanently错误,并且在随机数字之后尝试(从一到四)如下:

GET http://domain.com/socket.io?EIO=3&transport=polling&t=1441727903280-0 404 (Not Found)
GET http://domain.com/socket.io?EIO=3&transport=polling&t=1441727905168-1 404 (Not Found)
Client connected...

我看到的第一个请求显示以下信息:

Request URL:http://domain.com/socket.io/?EIO=3&transport=polling&t=1441728010300-0
Request Method:GET
Status Code:301 Moved Permanently

进程请求失败并显示404 Not Found,直到成功:

Request URL:http://domain.com/socket.io/?EIO=3&transport=polling&t=1441728015410-2
Request Method:GET
Status Code:200 OK

这里有什么奇怪的是,网络日志中为任何失败请求指定的URI如下所示:

失败

http://domain.com/socket.io?EIO=3&transport=polling

成功

http://domain.com/socket.io/?EIO=3&transport=polling

正如您所看到的,似乎客户端首先尝试连接到URI而没有尾随正斜杠;但是,任何并发的成功连接都包含正斜杠。

此问题是随机发生的,有时它会成功运行,大部分时间都会失败。它正在成功地开发我的开发环境。

我已经将问题简化到了一个点,我有一个简单的NodeJS服务器,客户端可以通过socket.io连接,如下所示:

客户端

<script type="text/javascript">
$(document).ready(function() {
     // open a socket connection
    var socket = io();

    socket.on('connect', function (user) {
        console.log('Client connected...');
    });
});
</script>

服务器

var server = require('http').createServer();
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(8083);

io.on('connection', function (socket) {
  console.log('Client connected successfully...');

  // Error reporting
  socket.on('error', function (err) {
    console.log("Socket.IO Error");
    console.log(err.stack);
  });

  socket.on('disconnect', function() {
    // redisClient.quit();
    console.log('Client disconnected...');
  });
});

注意:我目前正在使用haproxy将请求从端口80路由到8081(HTTP)和8083(NodeJS)。

到目前为止,我已经尝试了很多步骤,因此我们将非常感谢任何反馈。

1 个答案:

答案 0 :(得分:0)

我试图直接连接到IP地址(我以前在托管在不同的Web服务器上时已经做过),并发现客户端在第一次尝试时立即与服务器连接。因此,我确定了根本原因是我的.htaccess文件中的重定向,其中裸域被重定向到'www'CNAME,最终导致301 Moved Permanently错误。