我在部署到Heroku的node.js应用上遇到了一些问题。我想在所有场景中强制使用HTTPS。我也在使用Express。
我已按照此帖子中的代码进行操作:Heroku NodeJS http to https ssl forced redirect (arcseldon的回答)。
我在Chrome中测试。
这是我的测试场景: 如果我访问www.mywebsite.com,它会重定向https://www.mywebsite.com - >这是我期望的。
现在我在https://www.mywebsite.com。如果我在Chrome中访问该网址并修改了' 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接受请求而不进行重定向。
答案 0 :(得分:3)
我想我解决了我的问题。我使用的是Google Angular应用程序,该应用程序作为静态文件从公共目录中提供。 Express'app.use'中我的公共目录的声明在我的'app.use(forceSsl);'上面。
因此,我的公共目录中的静态文件(例如我的角色应用程序)在得到我的重新路由代码之前就被提供了。使用Express,您使用'app.use'语句的顺序非常重要。
我将公共目录的'app.use'重新命令为'app.use(forceSsl);'它似乎有效。
希望这可以帮助其他有类似问题的人。
答案 1 :(得分:1)
以下是使用html5网址的完整示例:
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);