我刚刚开始使用node.js和express,我正在做一个简单的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!');
});
答案 0 :(得分:2)
完成。实际上,在默认的120secs TLS handsahke超时后,对HTTPS套接字的HTTP请求结束。这样我就可以不用等待就结束请求了。如果有任何需要相同的功能,我会将我用于未来参考的解决方案包括在内。
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);
}
});
答案 1 :(得分:-1)
无法在同一端口上启动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上运行)。