节点红色requireHttps不起作用,访问http不会重定向到https

时间:2018-12-17 03:40:03

标签: https node-red

我正在尝试遵循this tutorial,通过使用HTTPS将节点红色实例公开到Internet。
简而言之,我在node-red的setting.js内添加(未注释)以下行:

var fs = require("fs");

requireHttps: true,

https: {
       key: fs.readFileSync('privatekey.pem'),
       cert: fs.readFileSync('certificate.pem')
},

https正常工作。但是,http不会重定向到https,而是提供ERR_EMPTY_RESPONSE

有人可以帮忙吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

按设计工作,Node-RED一次仅侦听一个端口,因此当配置为使用HTTPS时,它将不会响应HTTP流量。

这意味着仅使用Node-RED不能从一个重定向到另一个。更好的解决方案是使用nginx之类的东西来为Node-RED反向代理并让其处理重定向。

从您链接到的文章:

  

注意:我没有将此功能与SSL配合使用,因此您可能需要跳过此操作

您可以看到作者也弄错了,无法使它起作用。

答案 1 :(得分:0)

这无需任何其他Web服务器即可完成这项工作。

基于Node-RED documentation: Embedding into an existing app,node-RED与node.js提供的托管http和https服务器一起运行。

根据给定的Tuto,您不必覆盖settings.js。

要使其工作,必须创建自己的项目:

$ mkdir myNodeREDProject
$ cd myNodeRedProject
$ touch index.js
$ npm init
$ npm install node-red

将您的ssl私钥和证书复制到myNodeREDProject文件夹中。

编辑index.js并复制以下内容:

const https = require('https');
const express = require("express");
const RED = require("node-red");
const fs = require('fs');

const HTTP_PORT = 8080;
const HTTPS_PORT = 8443;

// Create an Express app
const app = express();

// at the top of routing: this is the http redirection to https part ;-)
app.all('*', (req, res, next) => {
  if (req.protocol === 'https') return next();
  res.redirect(`https://${req.hostname}:${HTTPS_PORT}${req.url}`);
});

// Add a simple route for static content served from 'public'
app.use("/",express.static("public"));

// Create a https server
const options = {
  key: fs.readFileSync('./privatekey.pem'),
  cert: fs.readFileSync('./certificate.pem')
};
const httpsServer = https.createServer(options, app);
// create a http server
const httpServer = http.createServer(app);

// Create the settings object - see default settings.js file for other options
const settings = {
  httpAdminRoot:"/red",
  httpNodeRoot: "/api",
  userDir:"./nodered/",
  functionGlobalContext: { }    // enables global context
};

// Initialise the runtime with a server and settings
RED.init(httpsServer,settings);

// Serve the editor UI from /red
app.use(settings.httpAdminRoot,RED.httpAdmin);

// Serve the http nodes UI from /api
app.use(settings.httpNodeRoot,RED.httpNode);

httpsServer.listen(HTTPS_PORT);
httpServer.listen(HTTP_PORT);

// Start the runtime
RED.start();

最后,运行node-RED应用程序:

$ node index.js   # MAGIC !!!

请,如果我错了,请立即纠正我,我已经在Linux服务器上对其进行了测试。

对不起,我的英语。