在Node.JS和Express中拦截HTTPS服务器上的HTTP响应

在Node.JS和Express中拦截HTTPS服务器上的HTTP响应,node.js,express,Node.js,Express,我只是从node.js和express开始,我正在做一个简单的HTTPS服务器。我使用nginx已经有一段时间了,当我向HTTPS端点发出HTTP请求时,会出现“400错误请求”错误。但是,当使用node.js时,请求永远不会完成 如何在Express中拦截HTTP请求以生成“400错误请求”响应 这是我的代码: var express = require('express'); var https = require('https'); var fs = require('fs'); va

我只是从node.js和express开始,我正在做一个简单的HTTPS服务器。我使用nginx已经有一段时间了,当我向HTTPS端点发出HTTP请求时,会出现“400错误请求”错误。但是,当使用node.js时,请求永远不会完成

如何在Express中拦截HTTP请求以生成“400错误请求”响应

这是我的代码:

var express = require('express'); 
var https = require('https');
var fs = require('fs');

var port = process.env.PORT || 8080;

var tls_options = {
  key: fs.readFileSync('certs/server.key'),
  cert: fs.readFileSync('certs/server.crt'),
  ca: fs.readFileSync('certs/ca.crt'),
  requestCert: true,
};

var app = express();
var router = express.Router();

router.get('/', function(req, res) {
    res.json({ message: 'Checkpoint!!' });  
});

app.use('/', router);

var secureServer = https.createServer(tls_options, app);
secureServer.listen(port);
console.log('Listening on port ' + port);
到目前为止,我唯一能够使用的是每次请求到达服务器时都会获得一个“连接”事件:

secureServer.on('connection', function (stream) {
   console.log('someone connected!');
});

无法在同一端口上同时启动HTTP和HTTPS服务器。大多数人所做的是:

在不同端口上启动两个服务器(一个HTTP和一个HTTPS),并将HTTP通信重定向到HTTPS。使用Express表示附加代码:

// create two ports, one for HTTP and one for HTTPS
var port = process.env.PORT || 8080;
var httpsPort = 8081;

// redirect all HTTP requests to HTTPS
app.use(function(req, res, next) {
    var hostname;

    if (!req.secure) {
        hostname = req.get("host").split(":")[0];
        return res.redirect(["https://", hostname, ":", httpsPort, req.url].join(""));
    }
    next();
});

app.listen(port);  // listen on HTTP
https.createServer(tls_options, app).listen(httpsPort);  // listen on HTTPS

或者他们使用nginx或apache来处理外部连接(HTTP和HTTPS),并将流量重定向到节点服务器(然后可以在HTTP上运行)。

完成。事实上,对HTTPS套接字的HTTP请求在默认120秒TLS handsahke超时后结束。这样我就可以结束请求而不必等待。如果有任何东西需要相同的功能,我会提供我用于将来参考的解决方案

var secureServer = https.createServer(options, app);
secureServer.on('connection', function(socket) {
    socket.on('data', function(data) {
    var first_line = data.toString().split('\r\n')[0];
    var pattern = /\bhttp\/1\.[01]$\b/i;
    if (pattern.test(first_line)) {
        var headers = {};
        headers['Date'] = new Date().toUTCString();
        headers['Connection'] = 'close';
        var headers_string = '';
        for (var name in headers) {
            headers_string = headers_string + '\r\n' + name + ': ' + headers[name];
        }
        socket.end('HTTP/1.1 400 Bad Request' + headers_string);
    }
});

谢谢你的评论。我知道我不能在同一个端口上启动两台服务器,我的意思是,即使我只有一台HTTPS服务器,如果我向这个端口发送HTTP请求,我也不会收到任何错误,请求永远不会结束。我只是在寻找一种避免这种情况的方法。这种方法对节点v0.10.x有效,但在v0.12.x之后就不起作用了。。。有什么想法吗?