在Heroku上强制Node.js应用程序使用HTTPS
我在部署到Heroku的node.js应用程序上强制使用SSL时遇到一些问题。我想在所有情况下强制使用HTTPS。我也在使用Express 我遵循了这篇帖子上的代码: (来自Arceldon的答案) 我正在测试Chrome 以下是我的测试场景: 如果我去www.mywebsite.com,它会重新指向->这是我所期望的工作 现在我在。如果我进入Chrome中的URL,将“https”编辑为“http”,然后点击回车键。它只是通过http建立连接(我在Chrome开发者工具中进行了检查) 这是我的代码片段,以防我做错了什么在Heroku上强制Node.js应用程序使用HTTPS,node.js,ssl,heroku,express,Node.js,Ssl,Heroku,Express,我在部署到Heroku的node.js应用程序上强制使用SSL时遇到一些问题。我想在所有情况下强制使用HTTPS。我也在使用Express 我遵循了这篇帖子上的代码: (来自Arceldon的答案) 我正在测试Chrome 以下是我的测试场景: 如果我去www.mywebsite.com,它会重新指向->这是我所期望的工作 现在我在。如果我进入Chrome中的URL,将“https”编辑为“http”,然后点击回车键。它只是通过http建立连接(我在Chrome开发者工具中进行了检查) 这是我的
var forceSsl = function (req, res, next) {
if ( req.headers['x-forwarded-proto'] != 'https'){
console.log( 'forceSSL req.get = ' + req.get('Host') + ' req.url = ' + req.url );
return res.redirect('https://' + req.get('Host') + req.url );
} else {
console.log( 'No need to re-direct to HTTPS' );
next();
}
};
if ('development' == app.get('env')) {
console.log('Started in dev mode');
// Other code here
} else if ('production' == app.get('env')) {
console.log('Started in PROD mode');
app.use(forceSsl);
app.use('/public', express.static(__dirname + '/public'));
app.use(express.errorHandler());
mongoose.connect(process.env.MONGOHQ_URL);
}
另一方面,我从未在“forceSsl”函数中看到控制台消息
我已将我的域配置为指向heroku应用程序的SSL版本,因此我不知道它是如何通过HTTP建立连接的
事先非常感谢您的帮助
编辑:
在上面的测试用例中,我认为它在Chrome中工作,我认为Chrome正在干预和重新定向,所以它可能没有按照预期工作
当我通过curl进行测试时,我可以看到该站点通过HTTP接受请求,而不进行重定向。我想我解决了我的问题。我使用的是谷歌Angular应用程序,它作为静态文件在公共目录外提供。Express“app.use”中我的公共目录的声明位于我的“app.use(forceSsl);”之上 因此,我的公共目录中的静态文件(例如,我的Angular应用程序)在到达我的重新路由代码之前就已经被发送出去了。对于Express,如何使用“app.use”语句的顺序非常重要 我重新订购了“app.use”,使我的公用目录位于“app.use(forceSsl);”下面这似乎奏效了
希望这能帮助其他有类似问题的人。我想我解决了我的问题。我使用的是谷歌Angular应用程序,它作为静态文件在公共目录外提供。Express“app.use”中我的公共目录的声明位于我的“app.use(forceSsl);”之上 因此,我的公共目录中的静态文件(例如,我的Angular应用程序)在到达我的重新路由代码之前就已经被发送出去了。对于Express,如何使用“app.use”语句的顺序非常重要 我重新订购了“app.use”,使我的公用目录位于“app.use(forceSsl);”下面这似乎奏效了
希望这能帮助其他有类似问题的人。下面是一个使用html5 URL的完整示例:
var express = require('express');
var http = require('http');
var app = express();
app.use(express.static('' + __dirname,{index:false}));
app.use('/*', function(req, res){
if(req.headers['x-forwarded-proto']!=='https'){
res.redirect(301, 'https://apps.iazi.ch'+req.url);
}
res.sendFile(__dirname + '/index.html');
});
var server = http.createServer(app);
server.listen(process.env.PORT || 5000);
以下是使用html5 URL的完整示例:
var express = require('express');
var http = require('http');
var app = express();
app.use(express.static('' + __dirname,{index:false}));
app.use('/*', function(req, res){
if(req.headers['x-forwarded-proto']!=='https'){
res.redirect(301, 'https://apps.iazi.ch'+req.url);
}
res.sendFile(__dirname + '/index.html');
});
var server = http.createServer(app);
server.listen(process.env.PORT || 5000);