express 4.x 将 http 重定向到 https

Posted

技术标签:

【中文标题】express 4.x 将 http 重定向到 https【英文标题】:express 4.x redirect http to https 【发布时间】:2014-07-23 19:06:37 【问题描述】:

我有以下代码:

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 正确执行此操作?

【问题讨论】:

【参考方案1】:

引用my own answer 的中间件解决方案(顺便说一句,在 express 3.0 上)

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

【讨论】:

对于任何使用 Heroku 的人来说,仅供参考,req.secure 将不起作用。在这里查看答案:***.com/questions/32952085/… req.host (express 3.x) 现在是 req.hostname (express 4.x) Elastic Beanstalk 或 ELB 后面的任何其他 EC2 实例也是如此,ELB 代表服务器终止 HTTPS。 截至 5/2017 w/ Express v 4.8.0:function 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'] 的解决方案仅在快速服务器位于注入标头 x-forwarded-proto 的负载均衡器之后才有效

以上是关于express 4.x 将 http 重定向到 https的主要内容,如果未能解决你的问题,请参考以下文章

通过重定向将数据从 Express 发送到 React

使用 nodejs/express 登录后将用户重定向到 Angular 应用程序

将 Express.js 4 的 res.status(401) 链接到重定向

express - nodejs - 如果在子域中,则保留 URL 而不是重定向

Node Express - 重定向到登录视图

如何使用 htaccess 将 IPS 4.x url 重定向到 XenForo 2