在Heroku上强制为Node.js应用程序提供HTTPS

时间:2014-08-04 17:12:52

标签: node.js ssl heroku express

我在部署到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接受请求而不进行重定向。

2 个答案:

答案 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);