在Heroku上强制Node.js应用程序使用HTTPS

在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开发者工具中进行了检查) 这是我的

我在部署到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);