是否可以设置相同的端口用于 http 和 https?

是否可以设置相同的端口用于 http 和 https?

我有一个 nodejs 应用程序,其端口号为3001,并且该应用程序可以使用 http,但不能使用 https。在 apache 服务器上,将反向代理设置为或80,并将反向代理也设置为 3001。4435001

http://<domain>:3001/socket.io/socket.js   ---> Work

https://<domain>:3001/socket.io/socket.js   ---> Not Work(Secure Connection Failed or This site can’t be reached)

这里我需要知道相同的端口( )是否与和一起3001工作?httphttps

有什么解决办法吗?

答案1

不可以,不可能在同一个端口上运行 HTTP 和 HTTPS。

使用 HTTPS 时,连接从一开始就使用 SSL/TLS 协议。客户端不可能使用纯 HTTP 开始传输。

如果在端口上检测到纯文本通信,SSL/TLS 标准不提供返回 HTTP 的方法。

答案2

我不知道他们是怎么做到的,但是我公司的开发人员正是做了@thomasrutter 所说的你不能做的事情:我们使用非标准 TCP 端口(所以不是 80,也不是 443)例如 8080,如果你在该端口上发送 http 请求,它会将你重定向到同一端口 8080 上的 https。他们使用 nginx 做到了这一点,但没有使用 apache2 实现这一点!

编辑:似乎在 nginx 中执行此操作并出现 497 错误代码,并且您的浏览器完成其余操作:https://ma.ttias.be/force-redirect-http-https-custom-port-nginx/

答案3

是的,这是可能的。2014 年,NodeJS GitHub 上就有人问过同样的问题(正是 Zig 名人 Andrew Kelley 提出的问题):“能否在同一端口上同时提供 HTTP 和 HTTPS 服务”->https://github.com/nodejs/node/issues/121

一位回复者推荐了这个非常简单的(!)NodeJS 包:https://github.com/mscdex/httpolyglot

大致来说,它通过检查新连接的第一个字节来工作。如果是不可打印的字符,则视为 SSL/TLS/HTTPS,否则视为 HTTP。非常令人印象深刻。更多详细信息请见此处:https://github.com/mscdex/httpolyglot/issues/3

相关内容