【发布时间】:2020-02-03 17:21:38
【问题描述】:
我有一个域名。
我有一个 Raspberry Pi 作为网络服务器。
我已编辑域的 A 记录以将其指向我的服务器的 IP。
通过letsencrypt我得到了一个证书,现在网站在https协议上工作(保持http为调试目的)
我正在开发一个使用 socket.io 但使用 apache+php 处理低级内容的 Messenger 应用程序
所以基本上 apache 监听 80 和 443 而 nodejs 监听 3000
显然,如果我通过 http 访问我的网站 - 一切正常,服务器和客户端都注册连接。
如果我通过 https 访问它 - Chrome 会抛出 net::ERR_CONNECTION_CLOSED 错误(尝试通过端口 3000 连接到 socket.io 时在控制台中。站点本身加载正常)。
客户:
var socket = new io(window.location.host+":3000", { secure: true });
socket.on("connect", function() {
console.log('success')
});
服务器:
const io = require("socket.io");
const server = io.listen(3000);
console.log("Server started");
server.on("connection", function (socket) {
console.log("+USER");
socket.emit("hello", "Connected");
});
我真的不想使用 express 或其他任何东西来保持一切尽可能小,特别是因为我已经有一个网络服务器正在运行。
如何正确设置,以便用户在通过 https 协议访问站点时可以在端口 3000 上连接到我的 socket.io 服务器?
更新: 从看起来我认为这是一个CORS类型的问题。通过 https 访问网站的用户试图连接到不安全的端口(本例为 3000),即使它是同一个域?如果不是所有浏览器,我认为这对很多人来说都是禁忌。 想到一个解决方案,将整个事情从 apache 移动到 nodejs 服务器模块,并通过 https 模块手动分配端口 3000 作为安全端口,但我不知道该怎么做,我真的很想保留我的apache 作为网络服务器,因为至少我比其他任何东西都更熟悉它。
【问题讨论】: