Node.js 套接字无法通过https工作

Node.js 套接字无法通过https工作,node.js,http,https,socket.io,Node.js,Http,Https,Socket.io,无法使用套接字在服务器和客户端之间建立连接。获取以下错误 GET https://**.**.**.**:9000/socket.io/?EIO=3&transport=polling&t=LvBYNwb net::ERR_CONNECTION_CLOSED Request.create @ socket.io.js:1456 Request @ socket.io.js:1369 XHR.request @ socket.io.js:1297 XHR.doPoll @ sock

无法使用套接字在服务器和客户端之间建立连接。获取以下错误

GET https://**.**.**.**:9000/socket.io/?EIO=3&transport=polling&t=LvBYNwb net::ERR_CONNECTION_CLOSED
Request.create @ socket.io.js:1456
Request @ socket.io.js:1369
XHR.request @ socket.io.js:1297
XHR.doPoll @ socket.io.js:1327
Polling.poll @ socket.io.js:1740
Polling.doOpen @ socket.io.js:1684
Transport.open @ socket.io.js:827
Socket.open @ socket.io.js:248
Socket @ socket.io.js:129
Socket @ socket.io.js:55
Manager.open.Manager.connect @ socket.io.js:4549
(anonymous) @ socket.io.js:4859
setTimeout (async)
Manager.reconnect @ socket.io.js:4849
(anonymous) @ socket.io.js:4863
(anonymous) @ socket.io.js:4570
Emitter.emit @ socket.io.js:2556
Socket.onError @ socket.io.js:688
(anonymous) @ socket.io.js:279
Emitter.emit @ socket.io.js:2556
Transport.onError @ socket.io.js:814
(anonymous) @ socket.io.js:1333
Emitter.emit @ socket.io.js:2556
Request.onError @ socket.io.js:1502
(anonymous) @ socket.io.js:1449
setTimeout (async)
xhr.onreadystatechange @ socket.io.js:1448
XMLHttpRequest.send (async)
Request.create @ socket.io.js:1456
Request @ socket.io.js:1369
XHR.request @ socket.io.js:1297
XHR.doPoll @ socket.io.js:1327
Polling.poll @ socket.io.js:1740
Polling.doOpen @ socket.io.js:1684
Transport.open @ socket.io.js:827
Socket.open @ socket.io.js:248
Socket @ socket.io.js:129
Socket @ socket.io.js:55
Manager.open.Manager.connect @ socket.io.js:4549
(anonymous) @ socket.io.js:4859
服务器(node.js)和客户端都通过HTTPS。若客户端通过HTTP,套接字工作正常,但一旦更改为HTTPS,结果就是错误。 无法配置套接字以使用HTTPS

服务器端:

import express from 'express';
import http from 'http';
var app = express();
var server = require('http').Server(app);
var socketio = require('socket.io').listen(server, { log: true });
客户端:

var socket = io('localhost:9000');
给你:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_pass http://localhost:9000;
proxy_set_header 'Access-Control-Allow-Headers' 'X-Requested-With,Accept,Content-Type, Origin';
proxy_set_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Access-Control-Allow-Methods' 'GET,DELETE, POST,PUT, OPTIONS';
add_header 'Content-Type' 'application/json';
Nginx HTTPS配置:

listen 443 ssl default_server;
if ($ssl_protocol = "") {
rewrite ^   https://$server_name$request_uri? permanent;
}
ssl_certificate /etc/example.com/ssl-bundle.crt;
ssl_certificate_key /etc/example.com/example.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
这就是我现在在example.com上看到的错误:

无法加载XMLHttpRequest . 这个 响应中“访问控制允许凭据”标头的值 是“true,true”,当请求的凭据 模式为“包含”。因此,源“”是 不允许访问。由发起的请求的凭据模式 XMLHttpRequest由withCredentials属性控制


假设NGINX在端口443上运行,则您的客户端连接到了错误的端口(9000,这是Express server正在侦听的端口,但客户端应该连接到NGINX代理)

在客户端中尝试以下操作:

var socket = io();
或者,通过HTTPS连接到特定服务器(和HTTPS端口,443):


您的服务器端不使用HTTPS。我已经为HTTPS设置了nginx。我确实在服务器端设置了HTTPS,但由于nginx的原因无法正常工作,需要一些指导。能否将nginx配置的相关部分(代理部分)添加到问题中?能否编辑问题并将其添加到其中?您现在将其作为评论发布。您的服务器代码中有两个不同的位置正在将
Access Control Allow Credentials
响应标题的值设置为
true
。您需要删除其中一个。客户端和服务器端正在不同的服务器上运行。所以我为服务器端定义了一个带有端口的IP。@Shanky好的,所以使用
var socket=io('https://your.server/“)
(没有端口号)
XMLHttpRequest无法加载https://example.com/socket.io/?EIO=3&transport=polling&t=LvC2GP8. 响应中“访问控制允许凭据”标头的值为“true,true”,当请求的凭据模式为“include”时,该值必须为“true”。起源'https://example1.com因此,不允许访问。XMLHttpRequest启动的请求的凭据模式由withCredentials属性控制。
var socket = io('https://server.example.com')