Express 4.x如何将HTTP重定向到HTTPS

25

我有以下代码:

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请求,使用node.js和express 4.x应该如何正确处理呢?

2个回答

40

引用我的答案(顺便说一下,这个答案是针对express 3.0的)中来自Stack Overflow的中间件解决方案:

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
}

11
提醒使用Heroku的用户,req.secure指令无法使用。请参考此处的答案:https://dev59.com/U1wY5IYBdhLWcg3wJU94 - Will Hitchcock
4
req.host(在express 3.x中使用)现在变成了req.hostname(在express 4.x中使用)。 - Claudiu Hojda
不一定。如果您的服务器位于像Cloudflare这样的服务后面,那么在您和Cloudflare(使用nginx)之间再添加另一层nginx是您可能不需要的额外复杂性。这也取决于您与Cloudflare之间的TLS设置 - 我正在使用Cloudflare和我的服务器之间的HTTPS,因此我需要在节点中进行此重定向,但这并不是一个很大的开销。 - Bart Read
6
截至2017年5月,使用Express v4.8.0版本:function ensureSecure(req, res, next){ if(req.headers['x-forwarded-proto'] === 'https'){ // 这是安全的,继续执行 return next() }; res.redirect('https://' + req.headers.host) } - Phil Andrews
5
当Express服务器位于负载均衡器后面时,使用req.headers['x-forwarded-proto']的@PhilAndrews解决方案是有效的,因为这会注入x-forwarded-proto头部。 - educalleja
显示剩余2条评论

3
您可以像这样进行重定向到https:
app.enable('trust proxy')
app.use((req, res, next) => {
    req.secure ? next() : res.redirect('https://' + req.headers.host + req.url)
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接