0

我正在 Node.JS 中编写 HTTP/HTTPS 代理服务器,我希望服务器在与 HTTP 相同的端口上处理 HTTPS 流量。

下图解释了我为什么要这样做,用户只需选中该框...

代理设置

我意识到我不能让 2 个服务器在同一个端口上监听,但是有没有办法设置一个将流量转发到 HTTP 或 HTTPS 流量的主服务器?

像这样的东西:

http.createServer(myHTTPCallback).listen(3129, '127.0.0.1');
https.createServer(myHTTPSCallback).listen(3130, '127.0.0.1');


//Then a main server that will listen for both kinds of traffic

main.createServer(function(req, res){
    if(/*Traffic is HTTPS*/){
        //Forward to 127.0.0.1:3130
    }
    else{
        //Forward to 127.0.0.1:3129
    }
}).listen(3128, '192.168.0.2');

我将如何编码上述内容?


编辑-根据@Chris Jester-Young 的回答

我创建了这个简单的服务器,但我只接收 HTTP 请求的输出。断点或控制台日志也不会跟踪:

var http = require('http');

http.createServer(function(req, res){
    res.write('<h1>Resquest Received</h1>');
    res.write('<span>Requested URL = ' + req.url + '</span>');

    res.end();
}).listen(3128);
4

1 回答 1

3

在您编写代理服务器的特定情况下,您不必在同一端口上同时监听 HTTP 和 HTTPS。浏览器通过 HTTP 连接到代理服务器,无论是代理 HTTP 还是 HTTPS 请求。HTTPS 请求使用CONNECTHTTP 方法打开与 HTTPS 服务器的直接连接——该CONNECT请求仍然在代理流量的未加密部分中完成。


编辑:这是我认为你的代码应该是这样的:

http.createServer(function (request, response) {
    // Handle normal requests here
}).on('connect', function (request, socket, head) {
    // Handle CONNECT requests here
}).listen(3128);
于 2013-08-20T11:07:23.343 回答