在Node.JS和Express中拦截HTTPS服务器上的HTTP响应
我只是从node.js和express开始,我正在做一个简单的HTTPS服务器。我使用nginx已经有一段时间了,当我向HTTPS端点发出HTTP请求时,会出现“400错误请求”错误。但是,当使用node.js时,请求永远不会完成 如何在Express中拦截HTTP请求以生成“400错误请求”响应 这是我的代码:在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
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之后就不起作用了。。。有什么想法吗?