Javascript 如何使用express 4.0在heroku上强制https重定向?

Javascript 如何使用express 4.0在heroku上强制https重定向?,javascript,node.js,heroku,express,Javascript,Node.js,Heroku,Express,我不明白为什么我下面的代码不能实现这一点?有人能解释一下我哪里出了问题吗?所有http请求都应该在heroku上重定向到https,但不能在localhost上。如果有人能给我举一个这样的例子,我会非常感激。我觉得这应该是非常简单和直接的 var app = express(); var https_redirect = function () { return function(req, res, next) { if(process.env.NODE_ENV === 'prod

我不明白为什么我下面的代码不能实现这一点?有人能解释一下我哪里出了问题吗?所有http请求都应该在heroku上重定向到https,但不能在localhost上。如果有人能给我举一个这样的例子,我会非常感激。我觉得这应该是非常简单和直接的

var app = express();

var https_redirect = function () {
  return function(req, res, next) {
    if(process.env.NODE_ENV === 'production'){
      if(req.headers['x-forwarded-proto'] != 'https') {
        return res.redirect('https://' + req.headers.host + req.url);
      } else {
        return next();
      }
    } else {
      return next();
    }
  };
};
app.use(https_redirect());

var server = app.listen(config.port, config.ip, function () {
});

exports = module.exports = app;

我已经做了一些搜索,看起来我所做的应该可以工作。

您的中间件的
req,res,next
参数由于被外部函数包装而丢失

试试这个:

var https_redirect = function(req, res, next) {
    if (process.env.NODE_ENV === 'production') {
        if (req.headers['x-forwarded-proto'] != 'https') {
            return res.redirect('https://' + req.headers.host + req.url);
        } else {
            return next();
        }
    } else {
        return next();
    }
};

app.use(https_redirect);

开源库检查
X-Forwarded-Proto
,应该与Heroku合作

非常简单,谢谢!这并不是说它会对性能产生可测量的影响,但在我看来,将If语句放在整个代码段周围,而不是添加作为生产之外的noop的中间件,会更有意义。这对我来说是可行的,但会重定向到端口80,这是行不通的。如何重定向到443?