在Openshift上使用https创buildExpress JS 4.0应用程序,包括httpredirect

继另一个SO问题后 ,我一直在尝试的最新(见ligatures.net ):

self.ipaddress = process.env.OPENSHIFT_NODEJS_IP; self.port = process.env.OPENSHIFT_NODEJS_PORT || 443; if (typeof self.ipaddress === "undefined") { self.ipaddress = "127.0.0.1"; }; ... self.app = express(); // 4.8.7 ... // Trusting Openshift proxy self.app.enable('trust proxy'); // Http -> Https redirection middleware self.app.use(function (req, res, next) { if ( !req.secure() ) { var tmp = 'https://' + process.env["DOMAIN_NAME"] + req.originalUrl; console.log("Redirect to: " + tmp); res.redirect(tmp); } else { next(); } }); ... // Creating a http server https.createServer(self.app).listen(self.port, self.ipaddress, function(err) { if (err) { console.log("Node server error: " + err.toString()); } else { console.log('%s: Node server started on %s:%d ...', Date(Date.now() ), self.ipaddress, self.port); } }); 

在Openshift日志中,我得到:

对象#的属性'secure'不是一个函数

这是行: if ( !req.secure() ) {

证书在控制台中加载。 应用程序在端口8080上成功启动。

为什么我得到这个消息,我应该如何在OpenShift中创build一个安全的Express 4.0 https应用程序? 有没有人有操作代码分享? 谢谢!

UPDATE

我已经更新了redirect如下:

 // Http -> Https redirection middleware self.app.use(function (req, res, next) { if ( req.headers['x-forwarded-proto'] === 'http' ) { var tmp = 'https://' + req.headers.host + req.originalUrl; console.log("SERVER redirect to: " + tmp); res.redirect(tmp); } else { var pt = req.protocol || ""; var ho = req.headers.host || ""; var ur = req.originalUrl || ""; console.log("\nProtocol: " + pt + "\nHost : " + ho + "\nUrl : " + ur); var tmp = req.protocol + '://' + req.headers.host + req.originalUrl; console.log("SERVER no redirect: " + tmp); next(); } 

我从控制台中看到以下几项:

 SERVER no redirect: http://undefined/ Protocol: http Host : Url : / 

而我的应用程序仍然无法正常工作。 它看起来像一个bug。

我已经打开了一个问题: https : //bugzilla.redhat.com/show_bug.cgi?id = 1138137

我也落后于Cloudflare,这可能是问题的一部分。

有两个问题:

i)如果您使用Cloudflare的免费计划,那么它将不会转发SSL请求。 如果您取消激活Cloudflare(例如保留他们的DNS),那么SSL请求将被转发到Openshift。

ii)由于某些未知的原因,一些空的请求在Openshift上启动时会到达我的应用程序,并且在稍后浏览页面时:

 req.path: / req.protocol: http req.originalUrl: / req.secure: false 

在Openshift的知识库文章中提到的代码不能正常工作,有两个原因。 首先, req.path不考虑查询参数。 应该使用req.originalUrl而不是Express 4.0。

其次,不要使用self.app.get(r, redirectSec, self.routes[r]); ,应该在Express 4.0中添加self.app.use中间件:

我的HTTP到HTTPS转发代码现在是:

 // Trusting Openshift proxy self.app.enable('trust proxy'); // Http -> Https redirection middleware self.app.use(function (req, res, next) { if ( req.headers['x-forwarded-proto'] === 'http' ) { var tmp = 'https://' + req.headers.host + req.originalUrl; res.redirect(tmp); } else { return next(); } } }); 

现在一切似乎都很好。

req.secure是一个属性,而不是一个函数。

试试help.openshift.com网站上的这段代码:

 function redirectSec(req, res, next) { if (req.headers['x-forwarded-proto'] == 'http') { res.redirect('https://' + req.headers.host + req.path); } else { return next(); } } 

这可以在这个知识库文章中find: https : //help.openshift.com/hc/en-us/articles/202398810-How-to-redirect-traffic-to-HTTPS-