Socket.io 1.0.6 的随机错误请求 400 错误

Posted

技术标签:

【中文标题】Socket.io 1.0.6 的随机错误请求 400 错误【英文标题】:Random bad request 400 errors with Socket.io 1.0.6 【发布时间】:2014-09-17 14:15:00 【问题描述】:

我在端口 8082 上使用 Node.js,在端口 80 上使用 Apache。

在一段时间内一切正常,然后浏览器开始显示错误消息“400 Bad Request”,CORS 错误。

服务器正在设置 CORS 标头。如您所见,我也在使用 Redis 适配器。

var io = require('socket.io').listen(8082);
io.adapter(redis( host: '127.0.0.1', port: 6379 ));
io.set('origins', 'domain.com:*');

无法说明为什么有时一切正常,有时却不行。 当 Socket.io 尝试从 pooling 升级到 websocket 时,总是会出现该错误。

当我使用https://cdn.socket.io/socket.io-1.0.6.js 的客户端时,我得到的错误更少。

当我对 socket.io-1.0.6.js 使用本地引用时,错误发生的频率更高。 找不到错误模式。

出现错误后,我重新启动了 Node.js 服务器,尝试了几个请求,工作了一段时间,一次又一次,错误。有时无需重新启动服务器即可再次工作。

请求标头示例

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Cookie  io=RjKzZ6Y1OTQeSEsPAAAL; SGM_DESENV=cb5ae798c2f6f5d3f38c6ed16a6e4696
Host    200.238.251.79:8082
Origin  http://200.238.251.79
Referer http://200.238.251.79/maximiliano/sgp/admin/custodiacompartilhada/add
User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0

响应标头示例

Access-Control-Allow-Credentials    true
Access-Control-Allow-Origin http://200.238.251.79
Connection  keep-alive
Content-Length  101
Content-Type    application/octet-stream
Date    Fri, 25 Jul 2014 16:10:26 GMT
Set-Cookie  io=9OYcCmU24IyzrAS3AAAM

错误信息

NetworkError: 400 Bad Request - http://200.238.251.79:8082/socket.io/?EIO=2&transport=polling&t=1406304539856-2&sid=RjKzZ6Y1OTQeSEsPAAAL

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://200.238.251.79:8082/socket.io/?EIO=2&transport=polling&t=1406304539856-2&sid=RjKzZ6Y1OTQeSEsPAAAL This can be fixed by moving the resource to the same domain or enabling CORS.

【问题讨论】:

你在用 NewRelic 吗? 你解决了这个问题吗? 【参考方案1】:

CORS 不允许在域名中使用通配符。

您必须允许来自所有域:

io.set('origins', '*');

或指定端口:

io.set('origins', 'http://200.238.251.79:8082');

(在另一个端口上请求意味着 CORS)

【讨论】:

这可能是真的,但现在不是了。请参阅 checkRequest github.com/socketio/socket.io/blob/master/lib/index.js 它允许主机名或端口使用通配符。

以上是关于Socket.io 1.0.6 的随机错误请求 400 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到 Socket.io 轮询请求的 404 错误?

Heroku 和 Socket.io,400 个错误请求和许多断开连接

socket.io heroku 请求超时

如果连接了 Socket.io,Alamofire 请求总是失败并显示“请求超时”

Express 4.0 中的 Heroku socket.io 示例错误

一次与两个用户随机聊天(Socket.io)