如何强制NodeJS应用使用https网址?我知道代码和选项。我的问题是,如果我只是去http(桌面) - 它会加载一些内容(但不应该),但如果它在移动设备上转到http,它不会加载或转发到https。
因此 - 我的问题:
如果我只有https创建服务器,没有http - 我不知道为什么它甚至加载非https代码......或者为什么它不转发到https?
https.createServer(options, app).listen(8000);
有什么想法吗?
答案 0 :(得分:1)
当您的应用在Bluemix中运行时,它实际上是在代理后面。代理正在处理请求,无论是http还是https,并将其作为http转发到您的应用。所以你的应用程序应该只听http。如果您希望外部用户始终使用https,则可以检查请求中的X-Forwarded-Proto
或$WSSC
标头,以查看最初使用的协议。如果是http,则可以将重定向发送到https。但同样,https频道将在Bluemix代理处结束,并作为http转发到您的应用。
答案 1 :(得分:1)
好吧 - 明白了。我之前访问过http://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html,但在宣布app之前明显错误地宣布了它。
轻松解决困扰我好几天的问题。
app.enable('trust proxy');
// Add a handler to inspect the req.secure flag (see
// http://expressjs.com/api#req.secure). This allows us
// to know whether the request was via http or https.
app.use (function (req, res, next) {
if (req.secure) {
// request was via https, so do no special handling
next();
} else {
// request was via http, so redirect to https
res.redirect('https://' + req.headers.host + req.url);
}
});
答案 2 :(得分:1)
在IBM Cloud(Bluemix)上,您应该按照以下步骤检查请求标头
// Check the request header
app.use (function (req, res, next) {
if (req.headers && req.headers.$wssc === "https")
{
// request was via https, so do no special handling
next();
} else {
// request was via http, so redirect to https or simply block
console.log("Blocked unsecured request");
// res.redirect('https://' + req.headers.host + req.url);
res.status(403).send();
}
});
请注意,默认的req.secure
在bluemix上不起作用,因为Bluemix代理服务器终止了SSL,因此所有流量看起来像HTTP到您的应用程序。但是,代理还添加了一个特殊的HTTP标头$ WSSC,其值为http或https