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

我刚刚开始与node.js和expression,我正在做一个简单的HTTPS服务器。 我一直在使用nginx一段时间,当我向HTTPS端点发出HTTP请求时,出现“400 Bad Request”错误。 但是,使用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!'); }); 

完成。 实际上,HTTPS套接字的HTTP请求在默认的120secs TLS握手超时后结束。 这样我可以不用等待就结束请求。 如果有什么需要相同的function,我将包含我仅用于将来参考的解决scheme。

 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); } }); 

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

在不同端口上启动两个服务器(一个HTTP和一个HTTPS),并将HTTP通信redirect到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),并将stream量redirect到Node服务器(然后可以在HTTP上运行)。