如何使用Express 4.0强制https重定向到heroku?

时间:2015-04-22 23:12:29

标签: 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 === '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;

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

2 个答案:

答案 0 :(得分:6)

你的中间件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);

答案 1 :(得分:2)

开源express-force-ssl库检查X-Forwarded-Proto并且应该与Heroku一起使用。 The code is very simple.