WebSocket握手期间WebSocket连接到'wss://'错误:意外响应代码:400

Dmi*_*kin 13 sockets nginx websocket node.js socket.io

我socket.io在我node.js正在运行的应用程序中使用express.

在本地版本(localhost)上的所有单词都很好但是当我切换到我的生产服务器(通过https使用自定义证书提供服务)时,我在浏览器控制台中收到以下错误:

websocket.js:112 WebSocket connection to 'wss://infranodus.com/socket.io/?EIO=3&transport=websocket&sid=j_WBxkPY_RlpF9_ZAANP' failed: Error during WebSocket handshake: Unexpected response code: 400

我做了一个研究(这里引用的问题),结果发生了这种情况,因为我的应用程序/托管提供程序阻止了类似的连接,wss然后我socket.io重新开始AJAX发出请求(功能正常,但有时会出现错误).

所以我想问你是否可以修改我的应用程序来摆脱这个错误?

仅供参考,目前所有对http://infranodus.com的请求都被转发(通过静态.htaccess)到https://infranodus.com和我的app.js文件(服务器激活的部分看起来像这样):

var http = require('http');

var app = express();

var server = http.Server(app);
var io = require('socket.io')(server);

app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
Run Code Online (Sandbox Code Playgroud)

以及我在前端文件中需要套接字的方式:

<script src="/socket.io/socket.io.js"></script>

然后

var socket = io();

也许问题是我使用http而不是在我的node.js应用程序中激活服务器https?但我不想改用它,因为我不知道我的证书存储在哪里,我不想太多地改变后端代码.

更新(21/10/2018):我们发现问题在于nginx服务器,并且由于某些托管服务提供商的限制,他们不允许用户编辑nginx服务器,因此安全协议上的websockets被阻止或得到400错误.在sockets.io中解决这个问题会很好,因为这是许多用户的问题.有任何想法吗?

重现问题:请打开您的Javascript控制台并访问https://infranodus.com/news/english

消息代码: https ://github.com/noduslabs/infranodus

小智 6

我用这个解决了它:

var socket = io.connect("http://localhost:3000", {
   forceNew: true,
   transports: ["polling"],
});
Run Code Online (Sandbox Code Playgroud)


Moh*_*eem 2

使用安全 URL 进行初始连接,即使用“https://”代替“http://”。如果选择 WebSocket 传输,则 Socket.IO 也应自动使用“wss://”(SSL) 进行 WebSocket 连接。

如果您在调用 io() 时未指定任何 URL,因为它默认尝试连接到提供该页面的主机,则您必须提供 url 或更改为 https

  var socket = io.connect('https://localhost', {secure: true}); //remote url
Run Code Online (Sandbox Code Playgroud)