Javascript express 4.x将http重定向到https

Javascript express 4.x将http重定向到https,javascript,node.js,http,redirect,express,Javascript,Node.js,Http,Redirect,Express,我有以下代码: var https = require('https'); var http = require('http'); var express = require('express'); var app = express(); var router = express.Router(); app.use('/', router); //have 'server' listen for https var se

我有以下代码:

var https        = require('https');
var http         = require('http');
var express      = require('express');
var app          = express();
var router       = express.Router();

app.use('/', router);

//have 'server' listen for https
var server = https.createServer(config.sslCredential, app);
server.listen(config.serverPort);

//listen server on http, and always redirect to https
var httpServer = http.createServer(function(req,res){
    res.redirect(config.serverDomain+req.url);
});
httpServer.listen(config.httpServerPort);

但不知何故,我无法将https请求重定向到https请求,在使用express 4.x的node.js上如何正确执行此操作?

引用中间件解决方案(顺便说一句,express 3.0上的是哪个中间件)


作为任何使用Heroku的人的参考,
req.secure
将不起作用。请参见此处的答案:
req.host
(express 3.x)现在是
req.hostname
(express 4.x)Elastic Beanstalk或ELB后面的任何其他EC2实例也是如此,其中ELB代表服务器终止HTTPS。从2017年5月起,w/express v 4.8.0:
函数ensureSecure(req,res,next){if(req.headers){['x-forwarded-proto']=='https'){//OK,continue return next()};res.redirect('https://'+req.headers.host)}
@PhilAndrews使用req.headers['x-forwarded-proto']的解决方案只有在express服务器位于注入报头x-forwarded-proto的负载平衡器后面时才有效
app.all('*', ensureSecure); // at top of routing calls

http.createServer(app).listen(80)
https.createServer(sslOptions, app).listen(443)

function ensureSecure(req, res, next){
  if(req.secure){
    // OK, continue
    return next();
  };
  // handle port numbers if you need non defaults
  // res.redirect('https://' + req.host + req.url); // express 3.x
  res.redirect('https://' + req.hostname + req.url); // express 4.x
}