在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-
- 在最新的Node&NPM下,Express服务器的SSL握手失败
- 与NodeJs HTTPS一起使用certificates.cer
- 我应该在node.js上监听哪些端口? 如何和为什么?
- Heroku上的HTTPS + SSL – Node + Express
- 在NodeJS服务器端保护Firebase存储的外部链接
- 节点v7.9.0的ERR_SSL_VERSION_OR_CIPHER_MISMATCH https
- 如何通过使用Node的HTTPS提供socket.io?
- 通过套接字连接将https代理请求pipe道传输到命名pipe道(node.js)
- 将https代理configuration为只允许TLS1.2进行传出请求